Kubernetes笔记—集群搭建

参考:
权威指南.pdf
kubernetes(k8s)课程.pdf
云平台搭建文档

Docker-Desktop中

1、Docker Desktop中开启、配置k8s
参考链接https://github.com/AliyunContainerService/k8s-for-docker-desktop/tree/v1.18.6
https://github.com/AliyunContainerService/k8s-for-docker-desktop/tree/v1.19.3

配置 Kubernetes

  1. 下载解压后,使用powershell运行load_images.ps1 验证:docker images<br /> <br /> 可选操作: 切换Kubernetes运行上下文至 docker-desktop (之前版本的 context docker-for-desktop)<br /> kubectl config use-context docker-desktop

验证 Kubernetes 集群状态
kubectl cluster-info
kubectl get nodes

配置 Kubernetes 控制台
kubectl create -f kubernetes-dashboard.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml

检查 kubernetes-dashboard 应用状态kubectl get pod -n kubernetes-dashboard

开启 API Server 访问代理 kubectl proxy

通过如下 URL 访问 Kubernetes dashboard
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

配置控制台访问令牌
对于Windows环境,在powershell下,一起运行:

$TOKEN=((kubectl -n kube-system describe secret default | Select-String “token:”) -split “ +”)[1]
kubectl config set-credentials docker-for-desktop —token=”${TOKEN}”
echo $TOKEN

得到TOKEN,复制粘贴到输入栏中,OK

问题:1、新电脑中,k8s一直处于starting状态,启动不起来。猜想原因:版本问题

github上下载的阿里云团队的文件,.proprties文件中的k8s参数对应于1.18.8,而新电脑中的docker对应的k8s版本是1.19.3,因此需要在.proprties文件中修改参数。具体见下图:
将1.18.8(或者其他)改为1.19.3,
将coredns的数字改为1.7.0,
将etcd的数字改为3.4.13
更改后,重新执行.\load_images.ps1)
image.png

MiniKube方式

阿里
https://github.com/AliyunContainerService/minikube

kubeadm方式搭建

image.png

简介:
kubelet不使用容器化,其他组件容器化。

  1. # 创建一个Master节点
  2. $ kubeadm init
  3. # 将一个Node节点加入到当前集群中
  4. $ kubeadm join <Master节点的IP和端口>

基本安装条件
- 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
- 集群中所有机器之间网络互通

安装目标
(1)在所有节点上安装 Docker 和 kubeadm
(2)部署 Kubernetes Master
(3)部署容器网络插件
(4)部署 Kubernetes Node,将节点加入 Kubernetes 集群中
(5)部署 Dashboard Web 页面,可视化查看 Kubernetes 资源

系统初始化工作

  1. #关闭防火墙
  2. $ systemctl stop firewalld
  3. $ systemctl disable firewalld
  4. #关闭 selinux:
  5. $ sed -i 's/enforcing/disabled/' /etc/selinux/config# 永久
  6. $ setenforce 0# 临时
  7. #临时关闭 swap:
  8. $ swapoff -a
  9. # 永久关闭swap
  10. $ sed -ri 's/.*swap.*/#&/' /etc/fstab
  11. #或者手动注释掉(##)swap内容
  12. $ vim /etc/fstab


  1. #设置主机名
  2. $ hostnamectl set-hostname <hostname>
  3. #在master添加hosts
  4. $ cat >> /etc/hosts << EOF
  5. 192.168.31.61 k8s-master
  6. 192.168.31.62 k8s-node1
  7. 192.168.31.63 k8s-node2
  8. EOF
  9. #将桥接的 IPv4 流量传递到 iptables 的链
  10. $ cat > /etc/sysctl.d/k8s.conf << EOF
  11. net.bridge.bridge-nf-call-ip6tables = 1
  12. net.bridge.bridge-nf-call-iptables = 1
  13. EOF
  14. $ sysctl --system
  15. # 生效
  16. #时间同步
  17. $ yum install ntpdate -y
  18. $ ntpdate time.windows.com

所有节点安装 Docker/kubeadm/kubelet

安装Docker

  1. $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
  2. /etc/yum.repos.d/docker-ce.repo
  3. $ yum -y install docker-ce-18.06.1.ce-3.el7
  4. $ systemctl enable docker && systemctl start docker
  5. $ docker --version

仓库加速

  1. $ cat > /etc/docker/daemon.json << EOF
  2. {
  3. "registry-mirrors": ["https://tcy950ho.mirror.aliyuncs.com"],
  4. #防止出现10248报错
  5. "exec-opts": ["native.cgroupdriver=systemd"]
  6. }
  7. EOF
  8. $ systemctl daemon-reload
  9. $ systemctl restart docker

添加 yum 源

  1. $ cat > /etc/yum.repos.d/kubernetes.repo << EOF
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  9. https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. EOF

安装 kubeadm,kubelet 和 kubectl

  1. $ yum install -y kubelet kubeadm kubectl
  2. $ systemctl enable kubelet

部署 Kubernetes Master

在Master执行

  1. $ kubeadm init \
  2. --apiserver-advertise-address=192.168.31.61 \
  3. --image-repository registry.aliyuncs.com/google_containers \
  4. --kubernetes-version v1.17.0 \
  5. --service-cidr=10.96.0.0/12 \
  6. --pod-network-cidr=10.244.0.0/16

安装网络插件(CNI)

(所有节点)

  1. $ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  2. $ kubectl apply f kube-flannel.yml

如果是单节点,则到此结束~

加入 Node

在 (Node)上执行。

首先确保从Worker节点能ping通 Master节点
例如云服务器中,Worker节点与Master节点不是一个运营商,则需要先在Worker节点执行以下命令
iptables -t nat -A OUTPUT -d <master_内网IP> -j DNAT --to-destination <mater_外网IP>

向集群添加新节点,执行上文 kubeadm init 命令中输出的 kubeadm join 命令

  1. $ kubeadm join 192.168.31.61:6443 --token esce21.q6hetwm8si29qxwn \
  2. --discovery-token-ca-cert-hash
  3. sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
  4. #如果token过期,可以生成一个
  5. $ kubeadm token create
  1. mkdir -p $HOME/.kube
  2. #将master节点的配置文件 复制到worker节点
  3. scp <master_ip>:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf
  4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  6. $ kubectl get nodes

命令补全功能

  1. yum install bash-completion -y
  2. source /usr/share/bash-completion/bash_completion
  3. source <(kubectl completion bash)
  4. echo "source <(kubectl completion bash)" >>~/.bashrc

kubeadm方式小结和补充

kubeadm 会为 Master 组件生成 Pod 配置文件。在 Kubernetes 中,有一种特殊的容器启动方法叫做“Static Pod”。它允许你把要部署的 Pod 的 YAML 文件放在一个指定的目录里。这样,当这台机器上的 kubelet 启动时,它会自动检查这个目录,加载所有的 Pod YAML 文件,然后在这台机器上启动它们。
从这一点也可以看出,kubelet 在 Kubernetes 项目中的地位非常高,在设计上它就是一个完全独立的组件,而其他 Master 组件,则更像是辅助性的系统容器。

  1. [root@zm manifests]# cd /etc/kubernetes/manifests/
  2. [root@zm manifests]# ls
  3. etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml

init时,可以使用配置文件方式
作用是定制化参数,如镜像地址等

  1. $ kubeadm init --config kubeadm.yaml

kubeadm的局限性
暂时不能用于生产环境,因为缺少高可用。(2022年呢?)

实践-云服务器

主机名 角色 内网IP 外网IP
zm master 172.23.178.70 47.94.156.242
zm-tencent worker 10.0.16.3 43.13823.201

整体上,参考kubeadm方式搭建。

  1. kubeadm init --apiserver-advertise-address=172.23.178.70 \
  2. --image-repository registry.aliyuncs.com/google_containers \
  3. --kubernetes-version 1.23.0 \
  4. --service-cidr=10.96.0.0/12 \
  5. --pod-network-cidr=10.244.0.0/16


问题:
image.png

原因:cgroup问题,需要在/etc/docker/daemon.json中加入一行:
"exec-opts": ["native.cgroupdriver=systemd"]
参考:https://www.codetd.com/article/13610139

  1. systemctl daemon-reload
  2. systemctl restart docker
  3. systemctl restart kubelet
  4. kubeadm reset
  5. 再重新执行kubeadm init命令

将Worker节点加入集群中

首先确认已经打开安全策略。Worker访问Master的6443端口。
执行

  1. kubeadm join 47.94.156.242:6443 \
  2. --token j6cvu0.bdw71hw2dmpv2vkw \
  3. --discovery-token-unsafe-skip-ca-verification
  4. #当时没保存hash码,,尝试跳过

报错
/proc/sys/net/ipv4/ip_forward contents are not set to 1”
原因:未打开IP转发。(腾讯云 服务器默认不开?)
解决

  1. 参考 https://blog.csdn.net/qq_39346534/article/details/107629830
  2. #输出应该是 0
  3. cat /proc/sys/net/ipv4/ip_forward
  4. #打开IP转发
  5. echo "1" > /proc/sys/net/ipv4/ip_forward
  6. $ 重启
  7. service network restart
  8. reboot now
  9. #输出应该是 1
  10. cat /proc/sys/net/ipv4/ip_forward

解决后,重新执行。

报错
error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed to get config map: Get “https://172.23.178.70:6443/api/v1/namespaces/kube-system/configmaps/kubeadm-config?timeout=10s”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

image.png

尝试用token和hash值来执行。查看token,并生成hash值。

  1. https://www.hangge.com/blog/cache/detail_2418.html
  2. #查看token
  3. $ kubeadm token list
  4. #如果token过期,可以生成一个
  5. $ kubeadm token create
  6. #证书hash值
  7. openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

执行

  1. $ kubeadm join 47.94.156.242:6443 \
  2. --token j6cvu0.bdw71hw2dmpv2vkw \
  3. --discovery-token-ca-cert-hash sha256:1ffa6f5c893d24e37d64833dd7fc0411c69e81436c1882e7493b8dae9e653ffe

又报错:
image.png
按照提示,改为master的内网IP

  1. $ kubeadm join 172.23.178.70:6443 \
  2. --token j6cvu0.bdw71hw2dmpv2vkw \
  3. --discovery-token-ca-cert-hash sha256:1ffa6f5c893d24e37d64833dd7fc0411c69e81436c1882e7493b8dae9e653ffe

报错,信息为:超时
分析原因:腾讯云服务器(worker) 访问 阿里云服务器(master)的内网IP地址,不通。
解决办法:
https://blog.csdn.net/qq_33996921/article/details/103529312
image.png

  1. #master节点 内网IP:172.23.178.70, 外网IP47.94.156.242
  2. $ iptables -t nat -A OUTPUT -d 172.23.178.70 -j DNAT --to-destination 47.94.156.242
  3. #需要reset一下
  4. $ kubeadm reset
  5. #重新执行
  6. $ kubeadm join 172.23.178.70:6443 \
  7. --token j6cvu0.bdw71hw2dmpv2vkw \
  8. --discovery-token-ca-cert-hash sha256:1ffa6f5c893d24e37d64833dd7fc0411c69e81436c1882e7493b8dae9e653ffe

成功!!
image.png

The connection to the server localhost:8080 was refused
https://blog.csdn.net/leenhem/article/details/119736586

遗留问题:
腾讯云服务器,访问nodeport服务报错连接拒绝。怀疑是防火墙、安全组问题
image.png

网络问题??

无法访问
节点上的pod启动不起来。
腾讯云节点上的flannel一直在重启。
image.png

腾讯云节点上的flannel的日志:

  1. [root@zm ~]# kubectl -n kube-system logs kube-flannel-ds-qgn8n -f
  2. Error from server: Get "https://10.0.16.3:10250/containerLogs/kube-system/kube-flannel-ds-qgn8n/kube-flannel?follow=true": dial tcp 10.0.16.3:10250: i/o timeout

通过添加安全组策略,解决了10250这个报错.

但“好景不长”,flannel立马出现了另一个报错:

  1. [root@zm ~]# kubectl -n kube-system logs kube-flannel-ds-ljfcz -f
  2. I0416 16:11:48.865888 1 main.go:205] CLI flags config: {etcdEndpoints:http://127.0.0.1:4001,http://127.0.0.1:2379 etcdPrefix:/coreos.com/network etcdKeyfile: etcdCertfile: etcdCAFile: etcdUsername: etcdPassword: version:false kubeSubnetMgr:true kubeApiUrl: kubeAnnotationPrefix:flannel.alpha.coreos.com kubeConfigFile: iface:[] ifaceRegex:[] ipMasq:true subnetFile:/run/flannel/subnet.env publicIP: publicIPv6: subnetLeaseRenewMargin:60 healthzIP:0.0.0.0 healthzPort:0 iptablesResyncSeconds:5 iptablesForwardRules:true netConfPath:/etc/kube-flannel/net-conf.json setNodeNetworkUnavailable:true}
  3. W0416 16:11:48.866035 1 client_config.go:614] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
  4. E0416 16:12:18.868370 1 main.go:222] Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-ljfcz': Get "https://10.96.0.1:443/api/v1/namespaces/kube-system/pods/kube-flannel-ds-ljfcz": dial tcp 10.96.0.1:443: i/o timeout

疑问:
10.96.0.1是什么??是否存在IP网段重合了?

DNS也有问题

  1. [root@zm001 cka]# kubectl -n test exec -it busybox -- nslookup nginx-test
  2. Server: 10.96.0.10
  3. Address: 10.96.0.10:53
  4. ** server can't find nginx-test.test.svc.cluster.local: NXDOMAIN
  5. *** Can't find nginx-test.svc.cluster.local: No answer
  6. *** Can't find nginx-test.cluster.local: No answer
  7. *** Can't find nginx-test.test.svc.cluster.local: No answer
  8. *** Can't find nginx-test.svc.cluster.local: No answer
  9. *** Can't find nginx-test.cluster.local: No answer
  10. command terminated with exit code 1
  1. [root@zm001 cka]# kubectl -n kube-system get pod | grep dns
  2. coredns-6d8c4cb4d-h9g4g 1/1 Running 1 (91m ago) 13h
  3. coredns-6d8c4cb4d-whpsl 1/1 Running 1 (91m ago) 13h
  4. [root@zm001 cka]# kubectl -n kube-system logs coredns-6d8c4cb4d-h9g4g
  5. .:53
  6. [INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
  7. CoreDNS-1.8.6
  8. linux/amd64, go1.17.1, 13a9191
  9. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:54398->114.114.114.114:53: i/o timeout
  10. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:46529->223.5.5.5:53: i/o timeout
  11. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:55103->223.5.5.5:53: i/o timeout
  12. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:52416->114.114.114.114:53: i/o timeout
  13. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:49380->114.114.114.114:53: i/o timeout
  14. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:52614->223.5.5.5:53: i/o timeout
  15. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:47237->114.114.114.114:53: i/o timeout
  16. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:44198->114.114.114.114:53: i/o timeout
  17. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:46395->114.114.114.114:53: i/o timeout
  18. [ERROR] plugin/errors: 2 901791048231310187.8649221354387709407. HINFO: read udp 10.244.0.4:47019->223.5.5.5:53: i/o timeout

image.png

实践-VMware虚拟机

整体上,参考kubeadm方式搭建。

主机名 角色 内网IP
zm001 master 192.168.78.100
zm002 worker 192.168.78.101
  1. kubeadm init --apiserver-advertise-address=192.168.78.100 \
  2. --image-repository registry.aliyuncs.com/google_containers \
  3. --kubernetes-version 1.23.0 \
  4. --service-cidr=10.96.0.0/12 \
  5. --pod-network-cidr=10.244.0.0/16

问题:
报错。查看kubelet日志
journalctl -xefu kubelet发现报错swap分区的问题

image.png

关闭swap分区
https://blog.csdn.net/u013288190/article/details/109028126
swapoff -a
$ sed -ri 's/.*swap.*/#&/' /etc/fstab

查看kubelet日志,继续报错。
可能需要重启机器,于是执行reboot now
重启后,kubelet状态变为active

kubeadm reset
再重新执行kubeadm init命令

成功!!
image.png

略过中间环节。。。

  1. kubeadm join 192.168.78.100:6443 --token 4196hz.hxp0f7fyuntze6kf \
  2. --discovery-token-ca-cert-hash sha256:542ca90b59bb7bd3c041a3892354b9d91fae7b6f5c0a6cc5a4a324c082e23b87

发现报错。原因是worker节点也存在swap分区问题。
参考上文,处理后,执行kubeadm reset

  1. [root@zm002 ~]# kubeadm reset
  2. [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
  3. [reset] Are you sure you want to proceed? [y/N]: y
  4. [preflight] Running pre-flight checks
  5. W0415 23:12:23.645534 8310 removeetcdmember.go:80] [reset] No kubeadm config, using etcd pod spec to get data directory
  6. [reset] No etcd config found. Assuming external etcd
  7. [reset] Please, manually reset etcd to prevent further issues
  8. [reset] Stopping the kubelet service
  9. [reset] Unmounting mounted directories in "/var/lib/kubelet"
  10. [reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
  11. [reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
  12. [reset] Deleting contents of stateful directories: [/var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni]
  13. The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d
  14. The reset process does not reset or clean up iptables rules or IPVS tables.
  15. If you wish to reset iptables, you must do so manually by using the "iptables" command.
  16. If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
  17. to reset your system's IPVS tables.
  18. The reset process does not clean your kubeconfig files and you must remove them manually.
  19. Please, check the contents of the $HOME/.kube/config file.

再次执行kubeadm join,成功

  1. [root@zm002 ~]# kubeadm join 192.168.78.100:6443 --token 4196hz.hxp0f7fyuntze6kf --discovery-token-ca-cert-hash sha256:542ca90b59bb7bd3c041a3892354b9d91fae7b6f5c0a6cc5a4a324c082e23b87
  2. [preflight] Running pre-flight checks
  3. [WARNING Hostname]: hostname "zm002" could not be reached
  4. [WARNING Hostname]: hostname "zm002": lookup zm002 on 114.114.114.114:53: no such host
  5. [preflight] Reading configuration from the cluster...
  6. [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
  7. [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
  8. [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
  9. [kubelet-start] Starting the kubelet
  10. [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
  11. This node has joined the cluster:
  12. * Certificate signing request was sent to apiserver and a response was received.
  13. * The Kubelet was informed of the new secure connection details.
  14. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

8080 refused

  1. #master上执行
  2. scp /etc/kubernetes/admin.conf 192.168.78.101:/etc/kubernetes/admin.conf
  3. #worker上执行
  4. export KUBECONFIG=/etc/kubernetes/admin.conf
  5. echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

二进制方式

安装要求

在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:
(1)一台或多台机器,操作系统 CentOS7.x-86_x64
(2)硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
(3)集群中所有机器之间网络互通
(4)可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
(5)禁止 swap 分区

环境规划


软件 版本
操作系统 CentOS7.8_x64 (mini)
Docker 19-ce
Kubernetes 1.19
角色 IP 组件
k8s-master kube-apiserver,
kube-controller-manager,
kube-scheduler,
etcd
k8s-node1 kubelet,
kube-proxy,
docker
etcd
k8s-node2 kubelet,
kube-proxy,
docker
etcd

操作系统初始化

  1. # 关闭防火墙
  2. systemctl stop firewalld
  3. systemctl disable firewalld
  4. # 关闭 selinux
  5. sed -i 's/enforcing/disabled/' /etc/selinux/config
  6. # 永久
  7. setenforce 0
  8. # 临时
  9. # 关闭 swap
  10. swapoff -a
  11. # 临时
  12. sed -ri 's/.*swap.*/#&/' /etc/fstab
  13. # 永久
  14. # 根据规划设置主机名
  15. hostnamectl set-hostname <hostname>
  16. # 在 master 添加 hosts
  17. cat >> /etc/hosts << EOF
  18. 192.168.44.147 m1
  19. 192.168.44.148 n1
  20. EOF
  21. # 将桥接的 IPv4 流量传递到 iptables 的链
  22. cat > /etc/sysctl.d/k8s.conf << EOF
  23. net.bridge.bridge-nf-call-ip6tables = 1
  24. net.bridge.bridge-nf-call-iptables = 1
  25. EOF
  26. sysctl --system
  27. # 生效
  28. # 时间同步
  29. yum install ntpdate -y
  30. ntpdate time.windows.com

部署etcd集群

准备 cfssl 证书生成工具

cfssl 是一个开源的证书管理工具,使用 json 文件生成证书,相比 openssl 更方便使用。
找任意一台服务器操作,这里用 Master 节点

  1. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  2. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  3. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  4. chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
  5. mv cfssl_linux-amd64 /usr/local/bin/cfssl
  6. mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  7. mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo

生成 Etcd 证书

自签证书颁发机构(CA)

  1. mkdir -p ~/TLS/{etcd,k8s}
  2. cd TLS/etcd
  3. cat > ca-config.json<< EOF
  4. {
  5. "signing": {
  6. "default": {
  7. "expiry": "87600h"
  8. },
  9. "profiles": {
  10. "www": {
  11. "expiry": "87600h",
  12. "usages": [
  13. "signing",
  14. "key encipherment",
  15. "server auth",
  16. "client auth"
  17. ]
  18. }
  19. }
  20. }
  21. }
  22. EOF
  23. cat > ca-csr.json<< EOF
  24. {
  25. "CN": "etcd CA",
  26. "key": {
  27. "algo": "rsa",
  28. "size": 2048
  29. },
  30. "names": [
  31. {
  32. "C": "CN",
  33. "L": "Beijing",
  34. "ST": "Beijing"
  35. }
  36. ]
  37. }
  38. EOF

生成证书

  1. cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
  2. ls *pem
  3. ca-key.pem
  4. ca.pem

使用自签 CA 签发 Etcd HTTPS 证书

创建证书申请文件:

  1. cat > server-csr.json<< EOF
  2. {
  3. "CN": "etcd",
  4. "hosts": [
  5. "192.168.31.71",
  6. "192.168.31.72",
  7. "192.168.31.73"
  8. ],
  9. "key": {
  10. "algo": "rsa",
  11. "size": 2048
  12. },
  13. "names": [
  14. {
  15. "C": "CN",
  16. "L": "BeiJing",
  17. "ST": "BeiJing"
  18. }
  19. ]
  20. }
  21. EOF

生成证书

  1. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -
  2. profile=www server-csr.json | cfssljson -bare server
  3. ls server*pem
  4. server-key.pem
  5. server.pem

部署 Etcd 集群

从 Github 下载二进制文件
下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz

以下在节点 1 上操作,为简化操作,待会将节点 1 生成的所有文件拷贝到节点 2 和节点 3.

  1. #创建工作目录并解压二进制包
  2. mkdir /opt/etcd/{bin,cfg,ssl} p
  3. tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
  4. mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/
  5. #创建 etcd 配置文件
  6. cat > /opt/etcd/cfg/etcd.conf << EOF
  7. #[Member]
  8. ETCD_NAME="etcd-1"
  9. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  10. ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380"
  11. ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379"
  12. #[Clustering]
  13. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380"
  14. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379"
  15. ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.71:2380,etcd-2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380"
  16. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  17. ETCD_INITIAL_CLUSTER_STATE="new"
  18. EOF

ETCD_NAME:节点名称,集群中唯一
ETCD_DATA_DIR:数据目录
ETCD_LISTEN_PEER_URLS:集群通信监听地址
ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址
ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址
ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址
ETCD_INITIAL_CLUSTER:集群节点地址
ETCD_INITIAL_CLUSTER_TOKEN:集群 Token
ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new 是新集群,existing 表示加入
已有集群

  1. #systemd 管理 etcd
  2. cat > /usr/lib/systemd/system/etcd.service << EOF
  3. [Unit]
  4. Description=Etcd Server
  5. After=network.target
  6. After=network-online.target
  7. Wants=network-online.target
  8. [Service]
  9. Type=notify
  10. EnvironmentFile=/opt/etcd/cfg/etcd.conf
  11. ExecStart=/opt/etcd/bin/etcd \
  12. --cert-file=/opt/etcd/ssl/server.pem \
  13. --key-file=/opt/etcd/ssl/server-key.pem \
  14. --peer-cert-file=/opt/etcd/ssl/server.pem \
  15. --peer-key-file=/opt/etcd/ssl/server-key.pem \
  16. --trusted-ca-file=/opt/etcd/ssl/ca.pem \
  17. --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
  18. --logger=zap
  19. Restart=on-failure
  20. LimitNOFILE=65536
  21. [Install]
  22. WantedBy=multi-user.target
  23. EOF
  1. #拷贝刚才生成的证书
  2. cp ~/TLS/etcd/ca*pem ~/TLS/etcd/server*pem /opt/etcd/ssl/
  3. #启动并设置开机启动
  4. systemctl daemon-reload
  5. systemctl start etcd
  6. systemctl enable etcd
  7. #将上面节点 1 所有生成的文件拷贝到节点 2 和节点 3
  8. scp -r /opt/etcd/ root@192.168.31.72:/opt/
  9. scp /usr/lib/systemd/system/etcd.service root@192.168.31.72:/usr/lib/systemd/system/
  10. scp -r /opt/etcd/ root@192.168.31.73:/opt/
  11. scp /usr/lib/systemd/system/etcd.service root@192.168.31.73:/usr/lib/systemd/system/
  1. #然后在节点 2 和节点 3 分别修改 etcd.conf 配置文件中的节点名称和当前服务器 IP:
  2. vi /opt/etcd/cfg/etcd.conf
  3. #[Member]
  4. ETCD_NAME="etcd-1"
  5. # 修改此处,节点 2 改为 etcd-2,节点 3 改为 etcd-3
  6. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  7. ETCD_LISTEN_PEER_URLS="https://192.168.31.71:2380"
  8. # 修改此处为当前服务器 IP
  9. ETCD_LISTEN_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器 IP
  10. #[Clustering]
  11. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.31.71:2380" # 修改此处为当前
  12. 服务器 IP
  13. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.31.71:2379" # 修改此处为当前服务器
  14. IP
  15. ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.31.71:2380,etcd-
  16. 2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380"
  17. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  18. ETCD_INITIAL_CLUSTER_STATE="new"
  19. #最后启动 etcd 并设置开机启动,同上。
  20. systemctl daemon-reload
  21. systemctl start etcd
  22. systemctl enable etcd

安装Docker

下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
以下在所有节点操作。这里采用二进制安装,用 yum 安装也一样。

  1. #解压二进制包
  2. tar zxvf docker-19.03.9.tgz
  3. mv docker/* /usr/bin
  4. #systemd 管理 docker
  5. cat > /usr/lib/systemd/system/docker.service << EOF
  6. [Unit]
  7. Description=Docker Application Container Engine
  8. Documentation=https://docs.docker.com
  9. After=network-online.target firewalld.service
  10. Wants=network-online.target
  11. [Service]
  12. Type=notify
  13. ExecStart=/usr/bin/dockerd
  14. ExecReload=/bin/kill -s HUP $MAINPID
  15. LimitNOFILE=infinity
  16. LimitNPROC=infinity
  17. LimitCORE=infinity
  18. TimeoutStartSec=0
  19. Delegate=yes
  20. KillMode=process
  21. Restart=on-failure
  22. StartLimitBurst=3
  23. StartLimitInterval=60s
  24. [Install]
  25. WantedBy=multi-user.target
  26. EOF
  27. #创建配置文件
  28. mkdir /etc/docker
  29. cat > /etc/docker/daemon.json << EOF
  30. {
  31. "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
  32. }
  33. EOF
  34. # 启动 并设置开机自启动
  35. systemctl daemon-reload
  36. systemctl start docker
  37. systemctl enable docker

部署Master Node

生成 kube-apiserver 证书

  1. #自签证书颁发机构(CA)
  2. cat > ca-config.json<< EOF
  3. {
  4. "signing": {
  5. "default": {
  6. "expiry": "87600h"
  7. },
  8. "profiles": {
  9. "kubernetes": {
  10. "expiry": "87600h",
  11. "usages": [
  12. "signing",
  13. "key encipherment",
  14. "server auth",
  15. "client auth"
  16. ]
  17. }
  18. }
  19. }
  20. }
  21. EOF
  22. cat > ca-csr.json<< EOF
  23. {
  24. "CN": "kubernetes",
  25. "key": {
  26. "algo": "rsa",
  27. "size": 2048
  28. },
  29. "names": [
  30. {
  31. "C": "CN",
  32. "L": "Beijing",
  33. "ST": "Beijing",
  34. "O": "k8s",
  35. "OU": "System"
  36. }
  37. ]
  38. }
  39. EOF
  40. #生成证书
  41. cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
  42. ls *pem
  43. ca-key.pem
  44. ca.pem
  1. #使用自签 CA 签发 kube-apiserver HTTPS 证书
  2. cd TLS/k8s
  3. cat > server-csr.json<< EOF
  4. {
  5. "CN": "kubernetes",
  6. "hosts": [
  7. "10.0.0.1",
  8. "127.0.0.1",
  9. "192.168.31.71",
  10. "192.168.31.72",
  11. "192.168.31.73",
  12. "192.168.31.74",
  13. "192.168.31.81",
  14. "192.168.31.82",
  15. "192.168.31.88",
  16. "kubernetes",
  17. "kubernetes.default",
  18. "kubernetes.default.svc",
  19. "kubernetes.default.svc.cluster",
  20. "kubernetes.default.svc.cluster.local"
  21. ],
  22. "key": {
  23. "algo": "rsa",
  24. "size": 2048
  25. },
  26. "names": [
  27. {
  28. "C": "CN",
  29. "L": "BeiJing",
  30. "ST": "BeiJing",
  31. "O": "k8s",
  32. "OU": "System"
  33. }
  34. ]
  35. }
  36. EOF
  37. #生成证书
  38. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -
  39. profile=kubernetes server-csr.json | cfssljson -bare server
  40. ls server*pem
  41. server-key.pem
  42. server.pem

部署 kube-apiserver

下载文件
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1183

  1. #解压二进制包
  2. mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
  3. tar zxvf kubernetes-server-linux-amd64.tar.gz
  4. cd kubernetes/server/bin
  5. cp kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/bin
  6. cp kubectl /usr/bin/
  7. #部署 kube-apiserver
  8. cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
  9. KUBE_APISERVER_OPTS="--logtostderr=false \\
  10. --v=2 \\
  11. --log-dir=/opt/kubernetes/logs \\
  12. --etcd-
  13. servers=https://192.168.31.71:2379,https://192.168.31.72:2379,https://192.168.3
  14. 1.73:2379 \\
  15. --bind-address=192.168.31.71 \\
  16. --secure-port=6443 \\
  17. --advertise-address=192.168.31.71 \\
  18. --allow-privileged=true \\
  19. --service-cluster-ip-range=10.0.0.0/24 \\
  20. --enable-admission-
  21. plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestric
  22. tion \\
  23. --authorization-mode=RBAC,Node \\
  24. --enable-bootstrap-token-auth=true \\
  25. --token-auth-file=/opt/kubernetes/cfg/token.csv \\
  26. --service-node-port-range=30000-32767 \\
  27. --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \\
  28. --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \\
  29. --tls-cert-file=/opt/kubernetes/ssl/server.pem
  30. \\
  31. --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\
  32. --client-ca-file=/opt/kubernetes/ssl/ca.pem \\
  33. --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
  34. --etcd-cafile=/opt/etcd/ssl/ca.pem \\
  35. --etcd-certfile=/opt/etcd/ssl/server.pem \\
  36. --etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
  37. --audit-log-maxage=30 \\
  38. --audit-log-maxbackup=3 \\
  39. --audit-log-maxsize=100 \\
  40. --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
  41. EOF
  42. #拷贝证书
  43. cp ~/TLS/k8s/ca*pem ~/TLS/k8s/server*pem /opt/kubernetes/ssl/

启用 TLS Bootstrapping 机制

  1. #创建上述配置文件中 token 文件
  2. cat > /opt/kubernetes/cfg/token.csv << EOF
  3. c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-
  4. bootstrapper"
  5. EOF
  1. #systemd 管理 apiserver
  2. cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
  3. [Unit]
  4. Description=Kubernetes API Server
  5. Documentation=https://github.com/kubernetes/kubernetes
  6. [Service]
  7. EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
  8. ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
  9. Restart=on-failure
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF
  1. #启动并设置开机启动
  2. systemctl daemon-reload
  3. systemctl start kube-apiserver
  4. systemctl enable kube-apiserver
  1. #授权 kubelet-bootstrap 用户允许请求证书
  2. kubectl create clusterrolebinding kubelet-bootstrap \
  3. --clusterrole=system:node-bootstrapper \
  4. --user=kubelet-bootstrap

部署 kube-controller-manager

  1. #创建配置文件
  2. cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF
  3. KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
  4. --v=2 \\
  5. --log-dir=/opt/kubernetes/logs \\
  6. --leader-elect=true \\
  7. --master=127.0.0.1:8080 \\
  8. --bind-address=127.0.0.1 \\
  9. --allocate-node-cidrs=true \\
  10. --cluster-cidr=10.244.0.0/16 \\
  11. --service-cluster-ip-range=10.0.0.0/24 \\
  12. --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
  13. --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem
  14. \\
  15. --root-ca-file=/opt/kubernetes/ssl/ca.pem \\
  16. --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
  17. --experimental-cluster-signing-duration=87600h0m0s"
  18. EOF
  19. #systemd 管理 controller-manager
  20. cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
  21. [Unit]
  22. Description=Kubernetes Controller Manager
  23. Documentation=https://github.com/kubernetes/kubernetes
  24. [Service]
  25. EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
  26. ExecStart=/opt/kubernetes/bin/kube-controller-manager
  27. \$KUBE_CONTROLLER_MANAGER_OPTS
  28. Restart=on-failure
  29. [Install]
  30. WantedBy=multi-user.target
  31. EOF
  32. #启动并设置开机启动
  33. systemctl daemon-reload
  34. systemctl start kube-controller-manager
  35. systemctl enable kube-controller-manager

部署 kube-scheduler

  1. #创建配置文件
  2. cat > /opt/kubernetes/cfg/kube-scheduler.conf << EOF
  3. KUBE_SCHEDULER_OPTS="--logtostderr=false \
  4. --v=2 \
  5. --log-dir=/opt/kubernetes/logs \
  6. --leader-elect \
  7. --master=127.0.0.1:8080 \
  8. --bind-address=127.0.0.1"
  9. EOF
  10. #systemd 管理 scheduler
  11. cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
  12. [Unit]
  13. Description=Kubernetes Scheduler
  14. Documentation=https://github.com/kubernetes/kubernetes
  15. [Service]
  16. EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
  17. ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
  18. Restart=on-failure
  19. [Install]
  20. WantedBy=multi-user.target
  21. EOF
  22. #启动并设置开机启动
  23. systemctl daemon-reload
  24. systemctl start kube-scheduler
  25. systemctl enable kube-scheduler
  26. #查看集群状态
  27. kubectl get cs

部署Worker Node

  1. 在所有 worker node 创建工作目录:
  2. mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
  3. master 节点拷贝:
  4. cd kubernetes/server/bin
  5. cp kubelet kube-proxy /opt/kubernetes/bin
  6. # 本地拷贝

部署 kubelet

  1. #创建配置文件
  2. cat > /opt/kubernetes/cfg/kubelet.conf << EOF
  3. KUBELET_OPTS="--logtostderr=false \\
  4. --v=2 \\
  5. --log-dir=/opt/kubernetes/logs \\
  6. --hostname-override=k8s-master \\
  7. --network-plugin=cni \\
  8. --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
  9. --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
  10. --config=/opt/kubernetes/cfg/kubelet-config.yml \\
  11. --cert-dir=/opt/kubernetes/ssl \\
  12. --pod-infra-container-image=lizhenliang/pause-amd64:3.0"
  13. EOF
  14. #配置参数文件
  15. cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF
  16. kind: KubeletConfiguration
  17. apiVersion: kubelet.config.k8s.io/v1beta1
  18. address: 0.0.0.0
  19. port: 10250
  20. readOnlyPort: 10255
  21. cgroupDriver: cgroupfs
  22. clusterDNS:
  23. - 10.0.0.2
  24. clusterDomain: cluster.local
  25. failSwapOn: false
  26. authentication:
  27. anonymous:
  28. enabled: false
  29. webhook:
  30. cacheTTL: 2m0s
  31. enabled: true
  32. x509:
  33. clientCAFile: /opt/kubernetes/ssl/ca.pem
  34. authorization:
  35. mode: Webhook
  36. webhook:
  37. cacheAuthorizedTTL: 5m0s
  38. cacheUnauthorizedTTL: 30s
  39. evictionHard:
  40. imagefs.available: 15%
  41. memory.available: 100Mi
  42. nodefs.available: 10%
  43. nodefs.inodesFree: 5%
  44. maxOpenFiles: 1000000
  45. maxPods: 110
  46. EOF
  47. #生成 bootstrap.kubeconfig 文件
  48. KUBE_APISERVER="https://192.168.31.71:6443" # apiserver IP:PORT
  49. TOKEN="c47ffb939f5ca36231d9e3121a252940" # 与 token.csv 里保持一致
  50. # 生成 kubelet bootstrap kubeconfig 配置文件
  51. kubectl config set-cluster kubernetes \
  52. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  53. --embed-certs=true \
  54. --server=${KUBE_APISERVER} \
  55. --kubeconfig=bootstrap.kubeconfig
  56. kubectl config set-credentials "kubelet-bootstrap" \
  57. --token=${TOKEN} \
  58. --kubeconfig=bootstrap.kubeconfig
  59. kubectl config set-context default \
  60. --cluster=kubernetes \
  61. --user="kubelet-bootstrap" \
  62. --kubeconfig=bootstrap.kubeconfig
  63. kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
  64. #拷贝到配置文件路径:
  65. cp bootstrap.kubeconfig /opt/kubernetes/cfg
  66. #systemd 管理 kubelet
  67. cat > /usr/lib/systemd/system/kubelet.service << EOF
  68. [Unit]
  69. Description=Kubernetes Kubelet
  70. After=docker.service
  71. [Service]
  72. EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
  73. ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
  74. Restart=on-failure
  75. LimitNOFILE=65536
  76. [Install]
  77. WantedBy=multi-user.target
  78. EOF
  79. #启动并设置开机启动
  80. systemctl daemon-reload
  81. systemctl start kubelet
  82. systemctl enable kubelet

批准 kubelet 证书申请并加入集群

  1. # 查看 kubelet 证书请求
  2. kubectl get csr
  3. # 批准申请
  4. kubectl certificate approve node-csr-uCEGPOIiDdlLODKts8J658HrFq9CZ--
  5. K6M4G7bjhk8A
  6. # 查看节点
  7. kubectl get node

部署 kube-proxy

  1. #创建配置文件
  2. # 切换工作目录
  3. cd TLS/k8s
  4. # 创建证书请求文件
  5. cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF
  6. KUBE_PROXY_OPTS="--logtostderr=false \\
  7. --v=2 \\
  8. --log-dir=/opt/kubernetes/logs \\
  9. --config=/opt/kubernetes/cfg/kube-proxy-config.yml"
  10. EOF
  11. #配置参数文件
  12. cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOF
  13. kind: KubeProxyConfiguration
  14. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  15. bindAddress: 0.0.0.0
  16. metricsBindAddress: 0.0.0.0:10249
  17. clientConnection:
  18. kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
  19. hostnameOverride: k8s-master
  20. clusterCIDR: 10.0.0.0/24
  21. EOF
  22. #生成 kube-proxy.kubeconfig 文件
  23. cat > kube-proxy-csr.json<< EOF
  24. {
  25. "CN": "system:kube-proxy",
  26. "hosts": [],
  27. "key": {
  28. "algo": "rsa",
  29. "size": 2048
  30. },
  31. "names": [
  32. {
  33. "C": "CN",
  34. "L": "BeiJing",
  35. "ST": "BeiJing",
  36. "O": "k8s",
  37. "OU": "System"
  38. }
  39. ]
  40. }
  41. EOF
  42. # 生成证书
  43. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -
  44. profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
  45. ls kube-proxy*pem
  46. kube-proxy-key.pem
  47. kube-proxy.pem
  48. #生成 kubeconfig 文件:
  49. KUBE_APISERVER="https://192.168.31.71:6443"
  50. kubectl config set-cluster kubernetes \
  51. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  52. --embed-certs=true \
  53. --server=${KUBE_APISERVER} \
  54. --kubeconfig=kube-proxy.kubeconfig
  55. kubectl config set-credentials kube-proxy \
  56. --client-certificate=./kube-proxy.pem \
  57. --client-key=./kube-proxy-key.pem \
  58. --embed-certs=true \
  59. --kubeconfig=kube-proxy.kubeconfig
  60. kubectl config set-context default \
  61. --cluster=kubernetes \
  62. --user=kube-proxy \
  63. --kubeconfig=kube-proxy.kubeconfig
  64. kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
  65. #拷贝到配置文件指定路径:
  66. cp kube-proxy.kubeconfig /opt/kubernetes/cfg/
  67. #systemd 管理 kube-proxy
  68. cat > /usr/lib/systemd/system/kube-proxy.service << EOF
  69. [Unit]
  70. Description=Kubernetes Proxy
  71. After=network.target
  72. [Service]
  73. EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
  74. ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
  75. Restart=on-failure
  76. LimitNOFILE=65536
  77. [Install]
  78. WantedBy=multi-user.target
  79. EOF
  80. # 启动并设置开机启动
  81. systemctl daemon-reload
  82. systemctl start kube-proxy
  83. systemctl enable kube-proxy

部署 CNI 网络

下载文件
https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz

  1. #解压二进制包并移动到默认工作目录:
  2. mkdir /opt/cni/bin
  3. tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
  4. #部署 CNI 网络:
  5. wget
  6. https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-
  7. flannel.yml
  8. sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0-
  9. amd64#g" kube-flannel.yml
  10. #默认镜像地址无法访问,修改为 docker hub 镜像仓库。
  11. kubectl apply -f kube-flannel.yml
  12. kubectl get pods -n kube-system
  13. kubectl get node
  14. #部署好网络插件,Node 准备就绪


授权 apiserver 访问 kubelet

  1. cat > apiserver-to-kubelet-rbac.yaml<< EOF
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: ClusterRole
  4. metadata:
  5. annotations:
  6. rbac.authorization.kubernetes.io/autoupdate: "true"
  7. labels:
  8. kubernetes.io/bootstrapping: rbac-defaults
  9. name: system:kube-apiserver-to-kubelet
  10. rules:
  11. - apiGroups:
  12. - ""
  13. resources:
  14. - nodes/proxy
  15. - nodes/stats
  16. - nodes/log
  17. - nodes/spec
  18. - nodes/metrics
  19. - pods/log
  20. verbs:
  21. - "*"
  22. ---
  23. apiVersion: rbac.authorization.k8s.io/v1
  24. kind: ClusterRoleBinding
  25. metadata:
  26. name: system:kube-apiserver
  27. namespace: ""
  28. roleRef:
  29. apiGroup: rbac.authorization.k8s.io
  30. kind: ClusterRole
  31. name: system:kube-apiserver-to-kubelet
  32. subjects:
  33. - apiGroup: rbac.authorization.k8s.io
  34. kind: User
  35. name: kubernetes
  36. EOF
  37. kubectl apply -f apiserver-to-kubelet-rbac.yaml

新增加 Worker Node

  1. #在 master 节点将 Worker Node 涉及文件拷贝到新节点 192.168.31.72/73
  2. scp -r /opt/kubernetes root@192.168.31.72:/opt/
  3. scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.31.72:/usr/lib/systemd/system
  4. scp -r /opt/cni/ root@192.168.31.72:/opt/ scp /opt/kubernetes/ssl/ca.pem root@192.168.31.72:/opt/kubernetes/ssl
  5. #删除 kubelet 证书和 kubeconfig 文件
  6. rm /opt/kubernetes/cfg/kubelet.kubeconfig
  7. rm -f /opt/kubernetes/ssl/kubelet*
  8. # 修改主机名
  9. vi /opt/kubernetes/cfg/kubelet.conf
  10. --hostname-override=k8s-node1
  11. vi /opt/kubernetes/cfg/kube-proxy-config.yml
  12. hostnameOverride: k8s-node1
  13. #启动并设置开机启动
  14. systemctl daemon-reload
  15. systemctl start kubelet
  16. systemctl enable kubelet
  17. systemctl start kube-proxy
  18. systemctl enable kube-proxy
  19. #在 Master 上批准新 Node kubelet 证书申请
  20. kubectl get csr
  21. kubectl certificate approve node-csr-4zTjsaVSrhuyhIGqsefxzVoZDCNKei-
  22. aE2jyTP81Uro
  23. Kubectl get node

Rancher部署

胡珊
https://www.yuque.com/qinghou/bobplatform/vs5wfu

https://www.jianshu.com/p/870ef7ba8723

安装Docker


一键安装,适合能连互联网。

  1. #https://developer.aliyun.com/article/110806
  2. curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

镜像加速;重启docker

  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4. "registry-mirrors": ["https://tcy950ho.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker

创建集群

启动rancher容器

  1. #腾讯云
  2. docker run -d --restart=unless-stopped --privileged --name rancher -p 81:80 -p 444:443 rancher/rancher
  3. #无法访问。
  4. 防火墙是关闭状态
  5. 安全组也是放行状态
  6. #阿里云
  7. docker run -d --restart=unless-stopped --privileged --name rancher -p 82:80 -p 445:443 rancher/rancher
  8. docker logs container-id 2>&1 | grep "Bootstrap Password:"

浏览器输入地址。
按照提示修改密码。
创建集群

K8S-集群搭建 - 图13
按提示操作。集群状态变为“active”即可。

1649646317(1).png

安装kubectl

  1. curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
  2. chmod +x ./kubectl
  3. mv ./kubectl /usr/local/bin/kubectl

执行kubectl get ns 命令报错 8080refused解决:
界面上,下载kubeconfig文件;
创建文件/root/.kube/config,将kubeconfig文件内容写入。

  1. mkdir $HOME/.kube
  2. vi $HOME/.kube/config
  3. apiVersion: v1
  4. kind: Config
  5. clusters:
  6. - name: "local"
  7. cluster:
  8. server: "https://47.94.156.242:445/k8s/clusters/local"
  9. certificate-authority-data: "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJwekNDQ\
  10. VUyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQTdNUnd3R2dZRFZRUUtFeE5rZVc1aGJXbGoKY\
  11. kdsemRHVnVaWEl0YjNKbk1Sc3dHUVlEVlFRREV4SmtlVzVoYldsamJHbHpkR1Z1WlhJdFkyRXdIa\
  12. GNOTWpJdwpOREV4TURFek9EVXdXaGNOTXpJd05EQTRNREV6T0RVd1dqQTdNUnd3R2dZRFZRUUtFe\
  13. E5rZVc1aGJXbGpiR2x6CmRHVnVaWEl0YjNKbk1Sc3dHUVlEVlFRREV4SmtlVzVoYldsamJHbHpkR\
  14. 1Z1WlhJdFkyRXdXVEFUQmdjcWhrak8KUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVQzOEhLdGlYQ00wN\
  15. jJuVXRadlkyR1JQTG9WYU5EWjlrSDZFbFFYUTRwWQpnTHRTdFRHcTFaUEg3K0MvaWhTamNJNkZON\
  16. GlVU25ic3JyaFY3RTlxZ0VwU28wSXdRREFPQmdOVkhROEJBZjhFCkJBTUNBcVF3RHdZRFZSMFRBU\
  17. UgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVd2lESmt2cnAzS2JWTGlxRjRNaHoKN1hkb25xQXdDZ\
  18. 1lJS29aSXpqMEVBd0lEU0FBd1JRSWdEWHgvY3ZaQUUxSy9HU3AxNExhYmk2akR4ZHlsb0w4QQpiO\
  19. DIwYTAwOUhhZ0NJUURVWVVIbndIVC9IT0Q3ZFVLVm9Jc0g5aUlWK3NIZzgrL2NjTkw4QWR3Y2FnP\
  20. T0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ=="
  21. users:
  22. - name: "local"
  23. user:
  24. token: "kubeconfig-user-vndmjcbbvq:4c5d2ktkngzlpjwtm6gk64qrq76sqpzw2sr8894lsb25llfbrh2kqf"
  25. contexts:
  26. - name: "local"
  27. context:
  28. user: "local"
  29. cluster: "local"
  30. current-context: "local"

添加Worker节点

点击集群名,点击注册,选择节点角色Worker,在Worker节点上执行命令。

1649646491(1).png

问题

1、
无法访问nodeport http://47.94.156.242:31080/
云服务器中curl,结果如下:

  1. [root@iZ2ze17jk9h959rtcfyf6qZ ~]# curl localhost:31080
  2. curl: (7) Failed to connect to ::1: No route to host

原因:防火墙??开放端口?

image.png

但阿里云安全组设置中,已经包含了所有外部主机、所有端口
image.png

2、docker0: iptables: No chain/target/match by that name.

发现rancher页面无法访问,docker ps -a发现,rancher容器已经关闭,exit(1)
执行 **docer start <container_id>**,报错

image.png
原因:启动firewalld之后,iptables被激活,此时没有docker chain需要重启docker后被加入到iptable里面。
执行systemctl restart docker
再执行docer start <container_id>

3、rancher 添加worker 时,显示一直在注册中,
在worker节点查看容器rancher-agent日志,显示
WARNING: bridge-nf-call-ip6tables is disabled
解决:

  1. vi /etc/sysctl.conf
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. sysctl -p

Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
解决:

  1. sudo mkdir -p /etc/cni/net.d
  2. sudo cat > /etc/cni/net.d/10-flannel.conflist <<EOF
  3. {
  4. "name": "cbr0",
  5. "plugins": [
  6. {
  7. "type": "flannel",
  8. "delegate": {
  9. "hairpinMode": true,
  10. "isDefaultGateway": true
  11. }
  12. },
  13. {
  14. "type": "portmap",
  15. "capabilities": {
  16. "portMappings": true
  17. }
  18. }
  19. ]
  20. }
  21. EOF

Unable to register node “vm-16-3-centos” with API server: Post https://127.0.0.1:6443/api/v1/nodes: read tcp 127.0.0.1:57898->127.0.0.1:6443: read: connection reset by peer

离线部署

离线部署kubernetes集群: 离线安装Kubernetes v1.17.1 - 离线部署 - 简书 (jianshu.com)