当前位置:   article > 正文

kubeadm部署k8s集群_kubeadm join token

kubeadm join token

一 . 介绍

使用kubeadm部署k8s集群的步骤:
第一步:是在机器上部署容器运行时(docker,containerd等);
第二步:然后部署kubeadm,kubelet,kubectl这三个服务;
第三步:使用kubeadm init 部署master节点;
第四步:使用kubeadm join 加入其他节点。

二 . 节点准备工作:

1. 安装前确认每个节点的MAC和uuid唯一,不冲突

  1. # 查看MAC,确保每个节点的mac唯一
  2. ifconfig -a   
  3. # 查看product_uuid,确保每个节点的uuid唯一
  4. cat /sys/class/dmi/id/product_uuid

2.  设置主机名

hostnamectl set-hostname master1

3. 关闭防火墙

  1. # 关闭防火墙
  2. systemctl stop firewalld
  3. systemctl disable firewalld
  4. #禁用selinux,设置SELINUX=disabled
  5. vi /etc/selinux/config
  6. SELINUX=disabled

4. 禁用swap分区,禁用交换区分区 注释掉swap那行。

通过free 命令查看是否有swap 那行显示为0则表示关闭成功。

Kubernetes 1.8 开始要求关闭系统的Swap,如果不关闭,默认配置下 kubelet 将无法启动。
 

  1. vim /etc/fstab
  2. #/dev/mapper/cl-swap     swap                    swap    defaults 
  3. #查看swap是否关闭
  4. free -m
  5.              total     used     free    shared  buff/cache   available
  6. Mem:        15884      1611      9734       242    4538       13610
  7. Swap:           0        0        0 

5. 重启机器

6. 设置流量桥接

  1. # 确保 br_netfilter 模块被加载
  2. lsmod | grep br_netfilter
  3. # 若要显式加载该模块,可执行 
  4. sudo modprobe br_netfilter
  5. #允许iptables检查桥接流量
  6. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  7. br_netfilter
  8. EOF
  9. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
  10. net.bridge.bridge-nf-call-ip6tables = 1
  11. net.bridge.bridge-nf-call-iptables = 1
  12. EOF
  13. sudo sysctl --system

三. 部署主节点

  1. 安装容器运行时docker

  1. # 1. 如果已经安装了docker,卸载旧版本
  2. yum remove docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-engine
  10. #2. 安装docker
  11. # 提供yum-config-manager程序,device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
  12. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  13. # 3. 设置镜像仓库
  14. # yum-config-manager会自动生成/etc/yum.repos.d下面的yum源文件
  15. # 使用阿里云源
  16. sudo yum-config-manager --add-repo \
  17. https://download.docker.com/linux/centos/docker-ce.repo
  18. # 4. 查看可用版本
  19. yum list docker-ce --showduplicates | sort -r
  20. # 5. 安装最新版本,或者也可以安装指定版本
  21. yum -y install docker-ce docker-ce-cli containerd.io
  22. yum -y install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  23. # 6. 设置docker开机自启动
  24. systemctl start docker && systemctl enable docker
  25. # 7. 检查docker是否正常运行
  26. docker version
  27. # 8. 配置docker,使用 systemd 来管理容器的 cgroup。
  28. # 对于运行 Linux 内核版本 4.0 或更高版本,或使用 3.10.0-51 及更高版本的 RHEL 或 CentOS 的系统,
  29. # overlay2是首选的存储驱动程序
  30. # 由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装,推荐使用 systemd 驱动,不推荐 cgroupfs 驱动。
  31. sudo mkdir /etc/docker
  32. cat <<EOF | sudo tee /etc/docker/daemon.json
  33. {
  34. "exec-opts": ["native.cgroupdriver=systemd"],
  35. "log-driver": "json-file",
  36. "log-opts": {
  37. "max-size": "100m"
  38. },
  39. "storage-driver": "overlay2"
  40. }
  41. EOF
  42. # 9. 重启docker
  43. sudo systemctl daemon-reload
  44. sudo systemctl restart docker

2.  安装kubeadm,kubelet,kubectl

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。
  1. # 由于官网中的地址不可访问,所以添加阿里源
  2. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  3. [kubernetes]
  4. name=Kubernetes
  5. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  6. enabled=1
  7. gpgcheck=1
  8. repo_gpgcheck=1
  9. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. exclude=kube*
  11. EOF
  12. #安装 kubelet kubeadm kubectl
  13. #--disableexcludes=kubernetes 禁掉除了这个之外的别的仓库
  14. yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  15. systemctl enable kubelet && systemctl start kubelet

此时通过systemctl status 查看kubelet状态我failed,是正常现象。待kubeadm init完成后,生成了kubelet的配置文件后,kubelet服务即可正常运行。

3. 初始化master

可以通过配置文件的方式来初始化master,我们需要手动修改一些文件中的配置项,来使集群被初始化成我们想要的样子。

  1. # 生成初始化文件
  2. kubeadm config print init-defaults > kubeadm-init.yaml

 修改kubeadm-init.yaml文件

  • 将advertiseAddress: 1.2.3.4修改为本机IP地址 
  • 将imageRepository: k8s.gcr.io修改为imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers , 这里是修改成阿里云的仓库。
  • 修改节点名称,如果不修改就是默认的’node' 
  • 修改podSubnet,如果采用calico作为网络插件,需要改为192.168.0.0/16

修改后的文件如下:

  1. apiVersion: kubeadm.k8s.io/v1beta3
  2. bootstrapTokens:
  3. - groups:
  4. - system:bootstrappers:kubeadm:default-node-token
  5. token: abcdef.0123456789abcdef
  6. ttl: 24h0m0s
  7. usages:
  8. - signing
  9. - authentication
  10. kind: InitConfiguration
  11. localAPIEndpoint:
  12. advertiseAddress: 10.6.178.50
  13. bindPort: 6443
  14. nodeRegistration:
  15. criSocket: /var/run/dockershim.sock
  16. imagePullPolicy: IfNotPresent
  17. name: master01
  18. taints: null
  19. ---
  20. apiServer:
  21. timeoutForControlPlane: 4m0s
  22. apiVersion: kubeadm.k8s.io/v1beta3
  23. certificatesDir: /etc/kubernetes/pki
  24. clusterName: kubernetes
  25. controllerManager: {}
  26. dns: {}
  27. etcd:
  28. local:
  29. dataDir: /var/lib/etcd
  30. imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
  31. kind: ClusterConfiguration
  32. kubernetesVersion: 1.23.0
  33. networking:
  34. dnsDomain: cluster.local
  35. serviceSubnet: 10.96.0.0/12
  36. podSubnet: 192.168.0.0/16
  37. scheduler: {}

执行init:

  1. # 执行init
  2. kubeadm init --config kubeadm-init.yaml
  3. # 添加权限
  4. # 如果要使用root用户执行kubectl
  5. export KUBECONFIG=/etc/kubernetes/admin.conf
  6. # 要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分
  7. mkdir -p $HOME/.kube
  8. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  9. sudo chown $(id -u):$(id -g) $HOME/.kube/config

此时查看节点的状态,为Not ready,因为还没有安装网络插件。

4. 安装网络插件:

插件可以选择calico,flannel, cni等,参考kubeadm · Kubernetes指南 

安装网络插件,安装过程中会因为网络问题出现下载镜像失败,多试几次可能就成功了,或者在下载好镜像后手动上传到节点上。

calico安装可查看官网 Quickstart for Calico on Kubernetes 

注意:需要 kubeadm init 时设置 --pod-network-cidr=192.168.0.0/16 (calico的默认配置)

calico的部署可以参考Kubernetes安装与配置、初始化k8s集群、部署MySQL和本地应用到k8s集群 | Zlg's blog

在部署过程中会用到下面的几个镜像,可以先下载下来然后上传到master节点上面去,否则需要非常长的时间才能安装成功

  1. calico/typha                                v3.22.0   35c2fa1ee0a1   9 days ago     127MB
  2. calico/kube-controllers                     v3.22.0   df76d42861ee   9 days ago     132MB
  3. calico/apiserver                            v3.22.0   d0dec2d2ca4c   9 days ago     129MB
  4. calico/cni                                  v3.22.0   f86797de8afd   9 days ago     236MB
  5. calico/pod2daemon-flexvol                   v3.22.0   59daef946c8c   9 days ago     21.4MB
  6. calico/node                                 v3.22.0   f109b1742d34   9 days ago     213MB

准备好镜像后,就可以直接安装calico了。

  1. #从官网拷贝的安装命令如下
  2. kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
  3. kubectl create -f https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml
  4. #安装完成后可以查看节点的状态,发现状态正常
  5. kubectl get pod -A
  6. NAMESPACE NAME READY STATUS RESTARTS AGE
  7. calico-apiserver calico-apiserver-64c4b4d48b-nqclj 1/1 Running 0 44m
  8. calico-apiserver calico-apiserver-64c4b4d48b-rskvm 1/1 Running 0 44m
  9. calico-system calico-kube-controllers-77c48f5f64-zj8sq 1/1 Running 0 3h45m
  10. calico-system calico-node-f2lng 1/1 Running 0 3h45m
  11. calico-system calico-typha-886c95dd9-s8l74 1/1 Running 3 (59m ago) 3h45m
  12. kube-system coredns-65c54cc984-4fxfw 1/1 Running 0 4h3m
  13. kube-system coredns-65c54cc984-74m99 1/1 Running 0 4h3m
  14. kube-system etcd-master01 1/1 Running 2 (60m ago) 4h4m
  15. kube-system kube-apiserver-master01 1/1 Running 2 (59m ago) 4h4m
  16. kube-system kube-controller-manager-master01 1/1 Running 2 (59m ago) 4h4m
  17. kube-system kube-proxy-nnq9h 1/1 Running 2 (60m ago) 4h3m
  18. kube-system kube-scheduler-master01 1/1 Running 2 (59m ago) 4h4m
  19. tigera-operator tigera-operator-59fc55759-bm75m 1/1 Running 1 (61m ago) 3h45m
  20. kubectl get node
  21. NAME STATUS ROLES AGE VERSION
  22. master01 Ready control-plane,master 4h4m v1.23.3

四 . 加入节点

按照第一个节点的方式准备节点并安装容器运行时和kubeadm,kubectl,kubelet。然后执行kubeadm init 添加节点。

  1. #master节点初始化24h内可以通过下面的命令获取token
  2. kubeadm token list
  3. #获取hash值
  4. openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
  5. openssl dgst -sha256 -hex | sed 's/^.* //'
  6. # 执行节点join,其中的token为第一步中获取的token,hash为第二步获取的hash值
  7. kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
  8. #示例:
  9. kubeadm join --token abcdef.0123456789ab**** 10.6.178.**:6443 --discovery-token-ca-cert-hash sha256:cd7802bb17cac39acac1f2d7d953ad01b6c6e25078594170ff1****

附录

问题解决:

加入节点完成后,可以在master上查看节点状态。如果slave节点为Not ready,则可以查看该节点有哪些pod没有正确运行。在这里发现slave节点状态不对,是因为calico插件的镜像没有下载成功,手动执行docker load加载一下master节点导出来的镜像即可解决。

  1. # 查看slave节点是否有异常pod
  2. [root@master01 ~]# kubectl get pod --all-namespaces -o wide|grep slave1
  3. calico-system      calico-node-l7xgp                          0/1     Running   0             126m   10.6.178.51      slave1     <none>           <none>
  4. kube-system        kube-proxy-6h9m7                           1/1     Running   0             126m   10.6.178.51      slave1     <none>           <none>
  5. # 查看所有节点的状态
  6. [root@master01 ~]# kubectl get node
  7. NAME       STATUS   ROLES                  AGE    VERSION
  8. master01   Ready    control-plane,master   23h    v1.23.3
  9. slave1     Ready    <none>                 126m   v1.23.3

kubeadm init的过程:

kubeadm 的init的工作过程说明:

  1. 在做出变更前运行一系列的预检项来验证系统状态。一些检查项目仅仅触发警告, 其它的则会被视为错误并且退出 kubeadm,除非问题得到解决或者用户指定了 --ignore-preflight-errors=<错误列表> 参数。
  2.  为 Kubernetes 项目生成对外提供服务时所需的证书文件,都放在 Master 节点的 /etc/kubernetes/pki 目录下。

    比如:用户使用 kubectl 获取容器日志等 streaming 操作时,需要通过 kube-apiserver 向 kubelet 发起请求,这个连接也必须是安全的。kubeadm 为这一步生成的是 apiserver-kubelet-client.crt 文件,对应的私钥是 apiserver-kubelet-client.key。

    完整的证书文件如下,其中以.key结尾的都是私钥文件:

    1. apiserver.crt
    2. apiserver-etcd-client.crt
    3. apiserver-etcd-client.key   
    4. apiserver.key
    5. apiserver-kubelet-client.crt  # kube-apiserver 向kubelet发起请求使用(比如kubectl获取容器日志等操作)
    6. apiserver-kubelet-client.key  # apiserver-kubelet-client.crt的私钥
    7. ca.crt   #最主要的证书
    8. ca.key   # ca.crt的私钥
    9. etcd     # 这是一个目录
    10. front-proxy-ca.crt
    11. front-proxy-ca.key
    12. front-proxy-client.crt
    13. front-proxy-client.key
    14. sa.key
    15. sa.pub
  3. 在目录/etc/kubernetes/生成配置文件,配置文件中记录当前这个 Master 节点的服务器地址、监听端口、证书目录等信息, 以便 kubelet、kubectl和scheduler可以直接加载相应的conf文件使用里面的信息,来与 API 服务器建立安全的连接。
  4. 同时生成一个名为 admin.conf 的独立的 kubeconfig 文件,用于管理操作。剩下的过程请参考官方文档。
  1. # 完整的配置文件列表
  2. [root@master01 kubernetes]# ll /etc/kubernetes/|grep conf|awk '{print $NF}'
  3. admin.conf
  4. controller-manager.conf
  5. kubelet.conf
  6. scheduler.conf
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/40913?site
推荐阅读
相关标签
  

闽ICP备14008679号