kubeadm快速搭建k8s集群(kubernetes简化安装工具kubeadm)

目录

1、环境准备

2、系统配置 

    2.1、设置主机名

    2.2、免密登录

    2.3、安装依赖包【3台机器都执行】

    2.4、配置yum源【3台机器都执行】

    2.5、关闭防火墙、selinux和swap【3台机器都执行】

    2.6、配置内核参数【3台机器都执行】

    2.7、执行清理和更新【3台机器都执行】

3、安装docker 

4、使用kubeadm部署k8s集群

    4.1、安装kubeadm、kubelet和kubectl

    4.2、配置kubeadm

    4.3、使用kubeadm配置master节点

    4.4、配置网络

    4.5、验证dns集群是否可用【在master节点执行】

5、部署whoami 【在master节点执行】

6、安装Weave Scope监控集群


本文参考老师的文档:E:\meWork\study\project\subject-3\subject-3-k8s\专题三-Kubernetes_学习文档-N.docx

文档中的“3.3.kubernetes 简化安装工具 kubeadm

注意事项:很多命令只有复制word原文档的命令,粘贴、执行才不会报错,我从网页、notepad++,上覆制粘贴、执行都报错,可能是网页、notepad++有什么特殊的符号,centos不认识】,我重新安装了3次才成功

kubeadm是Kubernetes的官方提供用于快速安装Kubernetes集群的工具。
Kubernetes文档:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
官网参考资料:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
              https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/

1、环境准备

IP地址

节点角色

CPU

Memory

Hostname

192.168.0.35

master

>= 2c

>= 2G

Master

192.168. 0.36

worker

>= 2c

>= 2G

node1

192.168. 0.37

worker

>= 2c

>= 2G

Node2

至少需要2个CPU,否则在执行 “4.3 ”初始化master节点节点时,就会报错

2、系统配置 

    2.1、设置主机名

1、设置主机名

192.168.0.35机器执行:hostnamectl set-hostname master

192.168.0.36机器执行:hostnamectl set-hostname node1

192.168.0.37机器执行:hostnamectl set-hostname node2

2、编辑/etc/hosts文件,添加域名解析【3台机器都执行

cat <<EOF >>/etc/hosts
192.168.0.35 master
192.168.0.36 node1
192.168.0.37 node2
EOF

    2.2、免密登录

设置master可以无密码登录所有节点的root账户

截图参考的“3.2.2 K8S入门”中的“5.2、设置master可以无密码登录所有节点的root账户”:https://blog.csdn.net/pyl574069214/article/details/105594013#%E2%80%8B%C2%A0%C2%A0%20%C2%A0%205.2%E3%80%81%E8%AE%BE%E7%BD%AEmaster%E5%8F%AF%E4%BB%A5%E6%97%A0%E5%AF%86%E7%A0%81%E7%99%BB%E5%BD%95%E6%89%80%E6%9C%89%E8%8A%82%E7%82%B9%E7%9A%84root%E8%B4%A6%E6%88%B7

1、创建一个rsa的密钥(一路按回车到最后):ssh-keygen -t rsa
2、将公钥文件放到master的root账户下:ssh-copy-id root@master
3、将公钥文件放到node1的root账户下:ssh-copy-id root@node1
4、将公钥文件放到node2的root账户下:ssh-copy-id root@node2
5、在master节点上直接执行:ssh node1,就可以登录到node1节点,如下图:

    2.3、安装依赖包3台机器都执行

ipvs依赖 ipset;ntp保证各机器系统时间同步

安装依赖包

yum install -y epel-release

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget

/usr/sbin/modprobe ip_vs

    2.4、配置yum源3台机器都执行

1、配置阿里软件源(base和epel):
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup #如果没有epel-testing.repo,可以不执行此行
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2、配置国内Kubernetes源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

3、配置docker源:

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

 查看正在使用yum源:yum repolist

    2.5、关闭防火墙、selinux和swap3台机器都执行

1、关闭防火墙,清理防火墙规则,设置默认转发策略:
systemctl stop firewalld &&
systemctl disable firewalld &&
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat &&
iptables -P FORWARD ACCEPT

2、关闭SELinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

3、关闭swap分区

swapoff -a

sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

    2.6、配置内核参数3台机器都执行

1、由于ipvs已经在内核中,所以为kube-proxy开启ipvs的前提需要加载ip_vs_rr内核模块
2、br_netfilter在执行此步骤之前,请确保已加载模块
将桥接的IPv4流量传递到iptables的链,swappiness参数调整:
 

cat <<EOF >  /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward=1

net.ipv4.tcp_tw_recycle=0

vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它

vm.overcommit_memory=1 # 不检查物理内存是否够用

vm.panic_on_oom=0 # 开启 OOM

EOF

modprobe ip_vs_rr

modprobe br_netfilter

sysctl --system

    2.7、执行清理和更新3台机器都执行

(第一次需要比较久的时间):yum clean all&& yum makecache && yum update -y

3、安装docker 

查看最新的docker版本:
yum list docker-ce.x86_64 --showduplicates | sort -r
yum list docker-ce-cli.x86_64 --showduplicates |sort -r

3台机器都执行1、安装docker:yum install -y docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
2、docker加入到开机启动:systemctl enable docker && systemctl start docker
3、docker版本查看:docker version

配置一个docker加速【3台机器都执行

1、创建或修改/etc/docker/daemon.json:

只有复制word原文档的命令,粘贴、执行才不会报错,我从网页、notepad++,上覆制粘贴、执行都报错,可能是网页、notepad++有什么特殊的符号,centos不认识
## Create /etc/docker directory.
mkdir -p /etc/docker
# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
   "registry-mirrors": [
      "https://registry.docker-cn.com",
      "https://hub-mirror.c.163.com", 
      "https://docker.mirrors.ustc.edu.cn"
   ],
   "exec-opts": ["native.cgroupdriver=systemd"],
   "log-driver": "json-file",
   "log-opts": {
      "max-size": "100m",
      "max-file": "5"
   }
}
EOF
# Restart Docker
systemctl daemon-reload && systemctl restart docker

如果装错了

1、卸载旧版本:yum remove docker docker-common docker-selinux docker-engine

2、删除daemon.json文件:rm -f /etc/docker/daemon.json

3、查询docker安装过的包:yum list installed | grep docker

4、删除安装包:yum remove docker-ce.x86_64 docker-ce-cli.x86_64

5、删除容器:rm -rf /var/lib/docker

直接启动docker(如果启动失败,可以直接看到错误信息):dockerd

2、可以通过docker info查看是否配置成功

确认一下iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT:iptables -nvL

如果不是,再执行一下“关闭防火墙,清理防火墙规则,设置默认转发策略”的命令。

4、使用kubeadm部署k8s集群

    4.1、安装kubeadm、kubelet和kubectl

3台机器都需要安装】如下3个软件包

Kubelet:负责与其他节点集群通信,并进行本节点Pod和容器生命周期的管理。
Kubeadm:是Kubernetes的自动化部署工具,降低了部署难度,提高效率。
Kubectl:是Kubernetes集群管理工具

1、查看可用版本:
yum list --showduplicates | grep 'kubeadm\|kubectl\|kubelet'
2、安装 kubeadm1.15.0, kubelet1.15.0 和 kubectl1.15.0【3台机器都执行
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0 --disableexcludes=kubernetes
3、先设置开机启动(此时还不能启动 kubelet)3台机器都执行
systemctl enable --now kubelet

从安装结果可以看出还安装了cri-tools, kubernetes-cni, socat三个依赖:
    1、socat是kubelet的依赖
    2、cri-tools是CRI(Container Runtime Interface)容器运行时接口的命令行工具

    4.2、配置kubeadm

查看kubelet安装了哪些文件:rpm -ql kubelet

修改/etc/sysconfig/kubelet3台机器都执行

sed -i "s/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS=\"--fail-swap-on=false\"/" /etc/sysconfig/kubelet
cat /etc/sysconfig/kubelet

在master节点执行即可

1、创建并修改配置:
# 导出配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

2、修改kubeadm.yml如下内容

vim kubeadm.yml

#1、修改为主节点IP【找到advertiseAddress】
advertiseAddress: 192.168.0.35
#2、【找到controllerManager】在前面加入一行
controlPlaneEndpoint: ""
#3、国内不能访问Google,修改为阿里云【找到imageRepository】
imageRepository: registry.aliyuncs.com/google_containers
#4、修改版本号【找到kubernetesVersion】
kubernetesVersion: v1.15.0
#5、配置成Flannel的默认网段【找到dnsDomain】在dnsDomain后面加入一行
podSubnet: "10.244.0.0/16"
#6、末尾加入如下行
---
# 开启 IPVS 模式

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
  mode: ipvs

少了中划线。就会报如下错误:

 3、查看和拉取镜像

# 查看所需镜像列表
kubeadm config images list --config kubeadm.yml
# 拉取镜像【3台机器都执行】【需要先将kubeadm.yml文件复制到其他机器,其他机器才能执行拉取镜像
kubeadm config images pull --config kubeadm.yml

如果一个都没有拉取到,可能是配置daemon.json文件中的加速器没生效,可以用docker info查看一下

4、将kubeadm.yml文件复制到其他机器【在master节点执行

将kubeadm.yml文件复制到node1的/root目录下:scp kubeadm.yml root@node1:/root

将kubeadm.yml文件复制到node2的/root目录下:scp kubeadm.yml root@node2:/root

    4.3、使用kubeadm配置master节点

1、中途失败或是想修改配置可以使用kubeadm reset命令重置配置,再做初始化操作即可。

2、如果slave节点加入master时配置有问题可以在slave节点上使用kubeadm reset重置配置再使用kubeadm join命令重新加入即可。希望在master节点删除node,可以使用kubeadm delete nodes <NAME> 删除

1、初始化master节点在master节点执行kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

2、配置kubectl:命令在“初始化master节点”输出结果中

3、在工作节点执行加入集群命令:命令在“初始化master节点”输出结果中

4、验证是否成功:kubectl get node

如果报错:[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`

是因为:“2.6配置内核参数”没有成功,将2.6的命令再执行一次。

请备份好 kubeadm init 输出中的 kubeadm join 命令,因为您会需要这个命令来给集群添加节点。
如果忘记了Master的Token,可以在Master上输入以下命令查看:kubeadm token list
默认情况下Token过期是时间是24小时,如果Token过期以后,可以输入以下命令,生成新的Token
kubeadm token create
--discovery-token-ca-cert-hash的查看方法,在Master运行以下命令查看
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

初始化master节点kubeadm init执行过程说明:

    init:指定版本进行初始化操作
    preflight:初始化前的检查和下载所需要的 Docker 镜像文件
    kubelet-start:生成 kubelet 的配置文件 var/lib/kubelet/config.yaml,没有这个文件 kubelet 无法启动,所以初始化之前的                                 kubelet 实际上启动不会成功
    certificates:生成 Kubernetes 使用的证书,存放在 /etc/kubernetes/pki 目录中
    kubeconfig:生成 KubeConfig 文件,存放在 /etc/kubernetes 目录中,组件之间通信需要使用对应文件
    control-plane:使用 /etc/kubernetes/manifest 目录下的 YAML 文件,安装 Master 组件
    etcd:使用 /etc/kubernetes/manifest/etcd.yaml 安装 Etcd 服务
    wait-control-plane:等待 control-plan 部署的 Master 组件启动
    apiclient:检查 Master 组件服务状态。
    uploadconfig:更新配置
    kubelet:使用 configMap 配置 kubelet
    patchnode:更新 CNI 信息到 Node 上,通过注释的方式记录
    mark-control-plane:为当前节点打标签,打了角色 Master,和不可调度标签,这样默认就不会使用 Master 节点来运行 Pod
    bootstrap-token:生成 token 记录下来,后边使用 kubeadm join 往集群中添加节点时会用到
    addons:安装附加组件 CoreDNS 和 kube-proxy

在master节点验证worker节点是否成功:kubectl get cs,nodes

确认每个组件都处于healthy状态

    4.4、配置网络

1、查看pod状态

kubectl get pod -n kube-system -o wide

可以看出coredns尚未运行,此时我们还需要安装网络插件。

2、安装flannel network add-on

   1、下载kube-flannel.yml文件:curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    我这里下载不了,直接用的老师给的kube-flannel.yml文件

   2、编辑kube-flannel.yml内容
    

   3、应用kube-flannel.yml配置创建服务: kubectl apply -f  kube-flannel.yml

   4、监控Pod的状态:watch kubectl get pod --all-namespaces -o wide
    

如果有的status不是Running,就需要排查问题

1、查看pod情况:kubectl get pod -n kube-system

2、查看某一个pod报错的详情
    比如查看kube-flannel-ds-amd64-bjvqx报错的详情:kubectl describe pod kube-flannel-ds-amd64-bjvqx -n kube-system

如果是上图中的错误信息,就手动拉取镜像:docker pull quay.io/coreos/flannel:v0.12.0-amd64

然后通过docker images查看是否已经将flannel镜像拉取下来;【我这里反正是没有成功,后来我就将虚拟机删除,从安装,就好了,可能是中间那个命令没执行对

    4.5、验证dns集群是否可用在master节点执行

1、新建一个deployment

cd /opt/k8s/work
cat > my-nginx.yaml <<EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
EOF

kubectl create -f my-nginx.yaml

2、查看副本:kubectl get deploy

3、生成nginx服务:kubectl expose deploy my-nginx

4、查看nginx服务是否创建成功:kubectl get services --all-namespaces |grep my-nginx

5、创建另一个Pod,查看/etc/resolv.conf是否包含 kubelet 配置的--cluster-dns和--cluster-domain,是否能够将服务my-nginx解析到上面显示的Cluster IP 10.107.5.77

cd /opt/k8s/work
cat > dnsutils-ds.yml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: dnsutils-ds
  labels:
    app: dnsutils-ds
spec:
  type: NodePort
  selector:
    app: dnsutils-ds
  ports:
  - name: http
    port: 80
    targetPort: 80
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: dnsutils-ds
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  template:
    metadata:
      labels:
        app: dnsutils-ds
    spec:
      containers:
      - name: my-dnsutils
        image: tutum/dnsutils:latest
        command:
          - sleep
          - "3600"
        ports:
        - containerPort: 80
EOF

kubectl create -f dnsutils-ds.yml

6、查看服务:kubectl get service

删除服务:如下图

删除服务后,设置master节点,也可以安排pod 

7、# 所有主服务器都安排 pod

kubectl taint nodes --all node-role.kubernetes.io/master-

5、部署whoami 在master节点执行

1、在Master运行部署Whoami
kubectl create deployment whoami --image=idoall/whoami

 2、查看Whoami部署状态
kubectl get deployments
3、查看Whoami的部署信息
kubectl describe deployment whoami
4、查看Whoami的pod信息
kubectl describe po whoami
5、为Whoami扩展端口;创建一个可以通过互联网访问的Whoami容器
kubectl create service nodeport whoami --tcp=80:80
6、查看当前的服务状态
kubectl get svc,pods -o wide
7、测试Whoami服务是否运行正常【端口是6查出的服务端口】
curl node1:31796
8、删除Whoami部署
kubectl delete deployment whoami
kubectl delete service whoami

6、安装Weave Scope监控集群

1、安装Scope:kubectl apply -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')&k8s-service-type=NodePort"
2、查看命名空间是否创建成功:kubectl get namespace
3、查看weave的service、deployments、pods:kubectl get service,deployments,pods -o wide -n weave

在浏览器输入IP加上图service/weave-scope-app的端口:192.168.0.35:30630,就可以看到监控界面了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章