基于kubeadm快速部署kubernetesK8SV1.17.4集群无坑完整版

编程

 

基于kubeadm快速部署kubernetes K8S V1.17.4集群,并部署Dashboard Web页面,实现可视化查看Kubernetes资源

 

主机配置规划

服务器名称(hostname)系统版本配置内网IP外网IP(模拟)

k8s-master

CentOS7.7

2C/4G/20G

172.16.1.110

10.0.0.110

k8s-node01

CentOS7.7

2C/4G/20G

172.16.1.111

10.0.0.111

k8s-node02

CentOS7.7

2C/4G/20G

172.16.1.112

10.0.0.112

注意:没有swap分区

 

预定完成目标项

1、在所有节点上安装Docker和kubeadm

2、部署Kubernetes Master

3、部署容器网络插件

4、部署 Kubernetes Worker,并将节点加入Kubernetes集群中

5、部署Dashboard Web页面,可视化查看Kubernetes资源

关于二进制安装

kubeadm 是 Kubernetes 官方支持的安装方式,“二进制” 不是。本文档采用 kubernetes.io 官方推荐的 kubeadm 工具安装 kubernetes 集群。

 

架构图

 

安装docker、安装kubeadm,kubelet和kubectl

注意:所有机器都要安装

脚本如下:

  1 [root@k8s-master k8s_install]# pwd

2 /root/k8s_install

3# 脚本信息如下【支持多次执行】

4 [root@k8s-master k8s_install]# cat install_kubelet.sh

5 #!/bin/sh

6

7##### 在 master 节点和 worker 节点都要执行 【所有机器执行】

8

9# 加载环境变量

10 . /etc/profile

11 . /etc/bashrc

12

13###############################################

14# 添加主机名与IP对应关系(每台主机必须设置主机名)

15# 如下命令:没有则添加信息 若使用请根据自身主机情况修改 ★★★★★ 「你需要修改处」

16grep"172.16.1.110.*k8s-master" /etc/hosts || echo"172.16.1.110 k8s-master" >> /etc/hosts

17grep"172.16.1.111.*k8s-node01" /etc/hosts || echo"172.16.1.111 k8s-node01" >> /etc/hosts

18grep"172.16.1.112.*k8s-node02" /etc/hosts || echo"172.16.1.112 k8s-node02" >> /etc/hosts

19

20

21###############################################

22# 必要的基础配置或包安装

23 ## 必须安装 nfs-utils 才能挂载 nfs 网络存储

24yuminstall -y nfs-utils

25 ## wget 用于下载文件

26yuminstall -y wget

27## 其他必要包

28yuminstall -y conntrack ipvsadm ipset

29

30

31# 关闭 防火墙

32systemctl stop firewalld

33systemctl disable firewalld

34systemctl stop iptables

35systemctl disable iptables

36

37# 关闭 SeLinux

38 setenforce 0

39sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

40

41# 关闭 swap , 本次涉及的机器没有swap,因此注释了

42## 如果有swap分区则放开注释

43 #swapoff -a

44 #yes | cp /etc/fstab /etc/fstab_bak

45 #cat /etc/fstab_bak | grep -v swap > /etc/fstab

46

47# 时间设置

48## 时区设置:东八区,上海

49ls -l /etc/localtime | grep"Asia/Shanghai" || (rm -f /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime)

50## 时间同步定时任务:没有则添加定,进行时间同步

51 crontab -l | grep"ntpdate" || echo -e "# time sync

*/10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" >> /var/spool/cron/root

52 ## 查看硬件时间 hwclock --show

53## 系统时间同步到硬件时间

54 hwclock --systohc

55

56# 关闭邮件服务

57 systemctl stop postfix.service && systemctl disable postfix.service

58

59

60

61###############################################

62 # 修改 /etc/sysctl.conf

63# 开启 ip_forward 转发并解决流量路由不正确问题

64# 如果有配置,则修改

65sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward = 1#g" /etc/sysctl.conf

66sed -i "s#^net.ipv4.tcp_tw_recycle.*#net.ipv4.tcp_tw_recycle = 0#g" /etc/sysctl.conf

67sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables = 1#g" /etc/sysctl.conf

68sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables = 1#g" /etc/sysctl.conf

69# IPv6 转发

70sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding = 1#g" /etc/sysctl.conf

71sed -i "s#^net.netfilter.nf_conntrack_max.*#net.netfilter.nf_conntrack_max = 2310720#g" /etc/sysctl.conf

72## 如下两条非必要

73sed -i "s#^fs.file-max.*#fs.file-max = 52706963#g" /etc/sysctl.conf

74sed -i "s#^fs.nr_open.*#fs.nr_open = 52706963#g" /etc/sysctl.conf

75

76# 如果没有,追加

77grep"net.ipv4.ip_forward = 1" /etc/sysctl.conf || echo"net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

78grep"net.ipv4.tcp_tw_recycle = 0" /etc/sysctl.conf || echo"net.ipv4.tcp_tw_recycle = 0" >> /etc/sysctl.conf

79grep"net.bridge.bridge-nf-call-ip6tables = 1" /etc/sysctl.conf || echo"net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf

80grep"net.bridge.bridge-nf-call-iptables = 1" /etc/sysctl.conf || echo"net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf

81grep"net.ipv6.conf.all.forwarding = 1" /etc/sysctl.conf || echo"net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf

82grep"net.netfilter.nf_conntrack_max = 2310720" /etc/sysctl.conf || echo"net.netfilter.nf_conntrack_max = 2310720" >> /etc/sysctl.conf

83grep"fs.file-max = 52706963" /etc/sysctl.conf || echo"fs.file-max = 52706963" >> /etc/sysctl.conf

84grep"fs.nr_open = 52706963" /etc/sysctl.conf || echo"fs.nr_open = 52706963" >> /etc/sysctl.conf

85

86# 执行命令以生效

87 sysctl -p

88 #### 说明:上面的命令中/etc/sysctl.conf可以用/etc/sysctl.d/k8s.conf替换;生效使用sysctl -p /etc/sysctl.d/k8s.conf 命令

89

90

91###############################################

92 # kube-proxy 开启ipvs的前置条件【本步骤可忽略,但推荐使用IPVS】

93modprobe br_netfilter

94

95cat > /etc/sysconfig/modules/ipvs.modules << EOF

96 #!/bin/bash

97modprobe -- ip_vs

98modprobe -- ip_vs_rr

99modprobe -- ip_vs_wrr

100modprobe -- ip_vs_sh

101modprobe -- nf_conntrack_ipv4

102EOF

103

104chmod755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

105

106

107

108###############################################

109# 安装 docker

110## 参考文档如下

111 # https://www.cnblogs.com/zhanglianghhh/p/9891293.html

112 # https://docs.docker.com/install/linux/docker-ce/centos/

113 # https://docs.docker.com/install/linux/linux-postinstall/

114

115## 卸载旧版本 根据需要放开注释

116 #yum remove -y docker

117 #docker-client

118 #docker-client-latest

119 #docker-common

120 #docker-latest

121 #docker-latest-logrotate

122 #docker-logrotate

123 #docker-selinux

124 #docker-engine-selinux

125 #docker-engine

126

127 ## 设置 docker yum repository

128yuminstall -y yum-utils device-mapper-persistent-data lvm2

129yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

130

131## 安装docker

132 # yuminstall -y docker-ce

133yuminstall -y docker-ce-19.03.8

134

135 ## 启动docker服务,这样可以创建/etc/docker目录

136systemctl start docker

137

138## 配置daemon

139 ## 1、修改docker Cgroup Driver为systemd;2、日志格式设定

140## 如果不修改,在添加 worker 节点时可能会碰到如下错误

141 ## [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".

142 ## Please follow the guide at https://kubernetes.io/docs/setup/cri/

143cat > /etc/docker/daemon.json << EOF

144{

145"exec-opts": ["native.cgroupdriver=systemd"],

146"log-driver": "json-file",

147"log-opts": {

148"max-size": "100m"

149 }

150}

151EOF

152

153## 开机自启动

154 systemctl stop docker && systemctl daemon-reload && systemctl enable docker && systemctl start docker

155

156

157

158###############################################

159# 配置K8S的yum源

160cat > /etc/yum.repos.d/kubernetes.repo <<EOF

161[kubernetes]

162 name=Kubernetes

163 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

164 enabled=1

165 gpgcheck=0

166 repo_gpgcheck=1

167 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

168 https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

169EOF

170

171

172# 卸载旧版本 根据需要放开注释

173 #yum remove -y kubelet kubeadm kubectl

174

175# 由于版本更新频繁,这里指定版本号部署

176## 安装kubelet、kubeadm、kubectl

177 ## 将 ${1} 替换为 kubernetes 版本号,例如 1.17.4

178 ## yuminstall -y kubelet-${1} kubeadm-${1} kubectl-${1}

179yuminstall -y kubelet-1.17.4 kubeadm-1.17.4 kubectl-1.17.4

180

181

182# 重启 docker,并启动 kubelet

183 systemctl daemon-reload

184systemctl restart docker

185 systemctl enable kubelet && systemctl start kubelet

186

187

188# 打印分割线

189echo"====================="

190

191# 打印docker版本信息

192 docker version

执行上述脚本

 

kubelet 服务错误说明

用kubeadm的方法安装kubelet后,运行systemctl status kubelet 和 journalctl -f -u kubelet 发现kubelet服务启动失败,错误代码255。

 

后来查了资料,运行journalctl -xefu kubelet 命令查看systemd日志才发现,真正的错误是:

failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file"/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory

原因:

关键文件缺失,多发生于没有做 kubeadm init就运行了systemctl start kubelet。

暂时可以有不管,后面 kubeadm init 后会恢复正常。

 

部署Kubernetes Master与安装Pod网络插件(CNI)

注意:仅在master节点操作

kubeadm init 配置详解的官网地址如下:

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

这里使用 flannel 网络

 

master节点所需镜像

kubernetes 服务启动依赖很多镜像,这些镜像要是在国内没有(fan qiang)的话,是下载不下来的。这里我们可以去阿里云容器镜像服务【别人放好的镜像】搜寻并下载指定版本的镜像替代。

 

 

下载完成后,通过 docker tag … 命令修改成指定名称的镜像即可。

 

需要哪些镜像及版本

需要哪些镜像及版本,查看方式如下:

 1 [root@k8s-master ~]# kubeadm config images list --kubernetes-version v1.17.4

2 W0728 16:31:09.7709378119 validation.go:28] Cannot validate kube-proxy config - no validator is available

3 W0728 16:31:09.7709988119 validation.go:28] Cannot validate kubelet config - no validator is available

4 k8s.gcr.io/kube-apiserver:v1.17.4

5 k8s.gcr.io/kube-controller-manager:v1.17.4

6 k8s.gcr.io/kube-scheduler:v1.17.4

7 k8s.gcr.io/kube-proxy:v1.17.4

8 k8s.gcr.io/pause:3.1

9 k8s.gcr.io/etcd:3.4.3-0

10 k8s.gcr.io/coredns:1.6.5

 

获取初始化默认配置文件并修改

 1 [root@k8s-master k8s_install]# pwd

2 /root/k8s_install

3 [root@k8s-master k8s_install]# kubeadm config print init-defaults > kubeadm-config.yaml

4# 做了适当修改

5 [root@k8s-master k8s_install]# cat kubeadm-config.yaml

6 apiVersion: kubeadm.k8s.io/v1beta2

7bootstrapTokens:

8 - groups:

9 - system:bootstrappers:kubeadm:default-node-token

10 token: abcdef.0123456789abcdef

11 ttl: 24h0m0s

12 usages:

13 - signing

14 - authentication

15kind: InitConfiguration

16localAPIEndpoint:

17 # 改为本机内网IP

18 advertiseAddress: 172.16.1.110

19 bindPort: 6443

20nodeRegistration:

21 criSocket: /var/run/dockershim.sock

22 name: k8s-master

23 taints:

24 - effect: NoSchedule

25 key: node-role.kubernetes.io/master

26 ---

27apiServer:

28 timeoutForControlPlane: 4m0s

29 apiVersion: kubeadm.k8s.io/v1beta2

30 certificatesDir: /etc/kubernetes/pki

31clusterName: kubernetes

32controllerManager: {}

33dns:

34 type: CoreDNS

35etcd:

36 local:

37 dataDir: /var/lib/etcd

38imageRepository: k8s.gcr.io

39kind: ClusterConfiguration

40 # 本次部署的版本为 v1.17.4

41 kubernetesVersion: v1.17.4

42networking:

43 dnsDomain: cluster.local

44 # 添加如下行,指定pod网络的IP地址范围,因为flannel 就是这个网段

45 podSubnet: 10.244.0.0/16

46 # 默认值即可,无需改变。服务VIP使用可选的IP地址范围。默认10.96.0.0/12

47 serviceSubnet: 10.96.0.0/12

48scheduler: {}

49 ---

50# 添加如下配置段,调度方式从默认改为ipvs方式【如果上面初始化没有做ipvs,那么这段就不需要】

51 apiVersion: kubeproxy.config.k8s.io/v1alpha1

52kind: KubeProxyConfiguration

53featureGates:

54 SupportIPVSProxyMode: true

55 mode: ipvs

 

kubeadm init与flannel网络安装

创建 init_master.sh文件并编写脚本进行批量下载镜像;之后修改镜像tag,与google的k8s镜像名称一致;再之后初始化并安装Pod网络插件。

脚本如下:

 1 [root@k8s-master k8s_install]# pwd

2 /root/k8s_install

3 [root@k8s-master k8s_install]# cat init_master.sh

4 #!/bin/bash

5

6##### 在 k8s master 节点执行

7

8# 加载环境变量

9 . /etc/profile

10 . /etc/bashrc

11

12

13###############################################

14# 从国内下载 master 节点所需镜像,并对镜像重命名

15 # src_registry="registry.aliyuncs.com/google_containers"

16 src_registry="registry.cn-beijing.aliyuncs.com/google_registry"

17

18# 定义镜像集合数组

19 # 具体版本信息根据 kubeadm config images list --kubernetes-version v1.17.4 得到的

20 images=(

21 kube-apiserver:v1.17.4

22 kube-controller-manager:v1.17.4

23 kube-scheduler:v1.17.4

24 kube-proxy:v1.17.4

25 pause:3.1

26 etcd:3.4.3-0

27 coredns:1.6.5

28)

29# 循环从国内获取的Docker镜像

30for img in ${images[@]};

31do

32 # 从国内源下载镜像

33 docker pull ${src_registry}/$img

34 # 改变镜像名称

35 docker tag ${src_registry}/$img k8s.gcr.io/$img

36 # 删除源始镜像

37 docker rmi ${src_registry}/$img

38 # 打印分割线

39echo"======== $img download OK ========"

40done

41echo"********** k8s master docker images pull OK! **********"

42

43

44###############################################

45# kubeadm 初始化

46##### 初始化方式1

47# 这个初始化过程需要几分钟,具体时间取决于你的网络。

48 # --apiserver-advertise-address=x.x.x.x 本机内网地址 ★★★★★ 「你需要修改处」

49 # --service-cidr=x.x.x.x 为服务VIP使用可选的IP地址范围。默认10.96.0.0/12

50 # --pod-network-cidr=x.x.x.x 指定pod网络的IP地址范围。

51#kubeadm init

52 # --apiserver-advertise-address=172.16.1.110

53 # --kubernetes-version v1.17.4

54 # --service-cidr=10.96.0.0/12

55 # --pod-network-cidr=10.244.0.0/16

56

57##### 初始化方式2 【推荐方式】

58 # --upload-certs 自动颁发证书,高可用有意义,单机可选

59 # kubeadm-config.yaml文件,通过上文已得到该文件

60 kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

61echo"********** kubeadm init OK! **********"

62

63

64# 配置 kubectl

65mkdir -p $HOME/.kube/

66cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

67chown $(id -u):$(id -g) $HOME/.kube/config

68echo"********** kubectl config OK! **********"

69

70

71###############################################

72# Kubernetes CNI扁平化网络:Flannel、Calico、Canal和Weave

73 # https://blog.csdn.net/RancherLabs/article/details/88885539

74 # 安装 kube-flannel 网络

75 # 若能够访问到quay.io这个registery,可以注释掉下面3行docker命令。 在 kube-flannel.yml 文件中可得到 flannel 版本信息

76# 如果不能访问 quay.io这个registery,那么请使用下面3行

77 docker pull ${src_registry}/flannel:v0.12.0-amd64

78 docker tag ${src_registry}/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64

79 docker rmi ${src_registry}/flannel:v0.12.0-amd64

80 # 如果下载失败,那么可通过 https://github.com/coreos/flannel/blob/v0.12.0/Documentation/kube-flannel.yml 页面拷贝到本地

81wget https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml

82 kubectl apply -f kube-flannel.yml

83echo"********** kube-flannel network OK! **********"

84

85

86###############################################

87# master节点验证所有pod状态

88echo"********** kubectl get pods --all-namespaces -o wide **********"

89 # kubectl get pods -A -o wide # 与下面的命令等效

90 kubectl get pods --all-namespaces -o wide

91

92# master节点查看node状态

93echo"********** kubectl get nodes **********"

94kubectl get nodes

95

96echo"********** 获得 join 命令参数 **********"

97 kubeadm token create --print-join-command

执行上述脚本

 

部分命令说明:

查看所有pods运行信息

kubectl get pods --all-namespaces  # 或者kubectl get pods -A

kubectl get pods --all-namespaces -o wide

 

查看所有node节点信息,其中master也是一个节点

kubectl get nodes

kubectl get nodes -o wide

 

获得 join命令参数,复制后在其他node节点执行,执行后加入该master节点,形成一个集群

kubeadm token create --print-join-command

 

flannel扁平化网络查看

通过ifconfig命令,可见已经存在了扁平化网络。

 

扁平化网络说明:

Kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平化的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,Kubernetes 假定这个网络已经存在。而在私有云里搭建 Kubernetes 集群,就不能假定这个网络已经存在。我们需要自己实现这个网络假设,将不同节点上的 Docker 容器之间的互相访问先打通,然后运行 Kubernetes。

同一个Pod内的多个容器之间通讯:lo

各Pod之间的通讯:Overlay Network

Pod与Service之间的通讯:各节点的Iptables规则或者ipvs

Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务。简单来说,它的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动的传递到目标容器内。

flannel网络如下图:

 

 

部署Kubernetes Node并加入Kubernetes集群

备注:仅在worker节点执行

 

获得 join命令初始化worker节点并加入master

在master执行如下命令获取join参数。

1 [root@k8s-master ~]# kubeadm token create --print-join-command

2 kubeadm join172.16.1.110:6443 --token jb8qa8.wbjx2k7t8vuvqf4q --discovery-token-ca-cert-hash sha256:a694fbe124afd00c0024d4be102037d8f84c9e2e1da1c6638b7788ad71f556ef

有效时间,该 token 的有效时间为 2 个小时,2小时内可以使用此 token 初始化任意数量的 worker 节点。

本文根据规划在k8s-node01、k8s-node02机器上执行。

 

执行完毕后,在master机器查看节点信息:

 1 [root@k8s-master ~]# kubectl get nodes

2NAME STATUS ROLES AGE VERSION

3 k8s-master Ready master 47m v1.17.4

4 k8s-node01 NotReady <none> 30s v1.17.4

5 k8s-node02 NotReady <none> 25s v1.17.4

6 [root@k8s-master ~]#

7 [root@k8s-master ~]# kubectl get nodes -o wide

8 NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME

9 k8s-master Ready master 48m v1.17.4172.16.1.110 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8

10 k8s-node01 NotReady <none> 56s v1.17.4172.16.1.111 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8

11 k8s-node02 NotReady <none> 51s v1.17.4172.16.1.112 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8

12 # 因为此时在k8s-node01、k8s-node02没有flannel镜像,因此pod未启动

13 [root@k8s-master ~]# kubectl get pods -A -o wide

14NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

15 kube-system coredns-6955765f44-c9zfh 1/1 Running 0 48m 10.244.0.2 k8s-master <none> <none>

16 kube-system coredns-6955765f44-lrz5q 1/1 Running 0 48m 10.244.0.3 k8s-master <none> <none>

17 kube-system etcd-k8s-master 1/1 Running 0 48m 172.16.1.110 k8s-master <none> <none>

18 kube-system kube-apiserver-k8s-master 1/1 Running 0 48m 172.16.1.110 k8s-master <none> <none>

19 kube-system kube-controller-manager-k8s-master 1/1 Running 0 48m 172.16.1.110 k8s-master <none> <none>

20 kube-system kube-flannel-ds-amd64-dngrk 1/1 Running 0 46m 172.16.1.110 k8s-master <none> <none>

21 kube-system kube-flannel-ds-amd64-h4sn6 0/1 Init:0/10 76s 172.16.1.111 k8s-node01 <none> <none>

22 kube-system kube-flannel-ds-amd64-m92wp 0/1 Init:0/10 71s 172.16.1.112 k8s-node02 <none> <none>

23 kube-system kube-proxy-28dwj 0/1 ContainerCreating 0 76s 172.16.1.111 k8s-node01 <none> <none>

24 kube-system kube-proxy-c875m 1/1 Running 0 48m 172.16.1.110 k8s-master <none> <none>

25 kube-system kube-proxy-stg6w 0/1 ContainerCreating 0 71s 172.16.1.112 k8s-node02 <none> <none>

26 kube-system kube-scheduler-k8s-master 1/1 Running 0 48m 172.16.1.110 k8s-master <none> <none>

说明:k8s-node01、k8s-node02状态为NotReady

 

获取worker节点镜像

备注:仅在worker节点执行

创建 init_worker.sh文件并编写脚本批量下载镜像;之后修改镜像tag,与google的k8s镜像名称一致;再之后下载Pod网络插件。

脚本如下:

 1 [root@k8s-node01 k8s_install]# pwd

2 /root/k8s_install

3 [root@k8s-node01 k8s_install]# cat init_worker.sh

4 #!/bin/bash

5

6##### 在 k8s worker 节点执行

7

8# 加载环境变量

9 . /etc/profile

10 . /etc/bashrc

11

12

13###############################################

14# 从国内下载 node 节点所需镜像,并对镜像重命名

15 # src_registry="registry.aliyuncs.com/google_containers"

16 src_registry="registry.cn-beijing.aliyuncs.com/google_registry"

17# 定义镜像集合数组

18 # 具体版本信息根据 kubeadm config images list --kubernetes-version v1.17.4 得到的

19 images=(

20 kube-apiserver:v1.17.4

21 kube-controller-manager:v1.17.4

22 kube-scheduler:v1.17.4

23 kube-proxy:v1.17.4

24 pause:3.1

25 etcd:3.4.3-0

26 coredns:1.6.5

27)

28# 循环从国内获取的Docker镜像

29for img in ${images[@]};

30do

31 # 从国内源下载镜像

32 docker pull ${src_registry}/$img

33 # 改变镜像名称

34 docker tag ${src_registry}/$img k8s.gcr.io/$img

35 # 删除源始镜像

36 docker rmi ${src_registry}/$img

37 # 打印分割线

38echo"======== $img download OK ========"

39done

40echo"********** k8s node docker images pull OK! **********"

41

42

43

44###############################################

45# Kubernetes CNI网络:Flannel、Calico、Canal和Weave

46 # https://blog.csdn.net/RancherLabs/article/details/88885539

47# 确保能够访问到quay.io这个registery。

48 #docker pull quay.io/coreos/flannel:v0.12.0-amd64

49# 如果不能访问 quay.io这个registery,那么请使用下面3行。或从master那边将 flannel 镜像打包过来即可

50 docker pull ${src_registry}/flannel:v0.12.0-amd64

51 docker tag ${src_registry}/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64

52 docker rmi ${src_registry}/flannel:v0.12.0-amd64

53echo"********** flannel image OK! **********"

本文根据规划在k8s-node01、k8s-node02机器上执行。

 

work执行完毕后在master机器查看信息

执行完毕后,在master机器查看节点信息:

 1# 所有节点都是Ready状态了

2 [root@k8s-master ~]# kubectl get nodes

3NAME STATUS ROLES AGE VERSION

4 k8s-master Ready master 56m v1.17.4

5 k8s-node01 Ready <none> 9m35s v1.17.4

6 k8s-node02 Ready <none> 9m30s v1.17.4

7 [root@k8s-master ~]# kubectl get nodes -o wide

8 NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME

9 k8s-master Ready master 57m v1.17.4172.16.1.110 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8

10 k8s-node01 Ready <none> 9m47s v1.17.4172.16.1.111 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8

11 k8s-node02 Ready <none> 9m42s v1.17.4172.16.1.112 <none> CentOS Linux 7 (Core) 3.10.0-1062.el7.x86_64 docker://19.3.8

12 [root@k8s-master ~]# kubectl get pods -A -o wide

13NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

14 kube-system coredns-6955765f44-c9zfh 1/1 Running 0 57m 10.244.0.2 k8s-master <none> <none>

15 kube-system coredns-6955765f44-lrz5q 1/1 Running 0 57m 10.244.0.3 k8s-master <none> <none>

16 kube-system etcd-k8s-master 1/1 Running 0 57m 172.16.1.110 k8s-master <none> <none>

17 kube-system kube-apiserver-k8s-master 1/1 Running 0 57m 172.16.1.110 k8s-master <none> <none>

18 kube-system kube-controller-manager-k8s-master 1/1 Running 0 57m 172.16.1.110 k8s-master <none> <none>

19 kube-system kube-flannel-ds-amd64-dngrk 1/1 Running 0 55m 172.16.1.110 k8s-master <none> <none>

20 kube-system kube-flannel-ds-amd64-h4sn6 1/1 Running 0 10m 172.16.1.111 k8s-node01 <none> <none>

21 kube-system kube-flannel-ds-amd64-m92wp 1/1 Running 0 9m57s 172.16.1.112 k8s-node02 <none> <none>

22 kube-system kube-proxy-28dwj 1/1 Running 0 10m 172.16.1.111 k8s-node01 <none> <none>

23 kube-system kube-proxy-c875m 1/1 Running 0 57m 172.16.1.110 k8s-master <none> <none>

24 kube-system kube-proxy-stg6w 1/1 Running 0 9m57s 172.16.1.112 k8s-node02 <none> <none>

25 kube-system kube-scheduler-k8s-master 1/1 Running 0 57m 172.16.1.110 k8s-master <none> <none>

说明:k8s-node01、k8s-node02状态为Ready,且所有pod都正常运行

 

移除worker节点

正常情况下,无需移除 worker 节点,如果添加到集群出错,可以移除 worker 节点,再重新尝试添加。

比如:移除k8s-node01节点,步骤如下:

在准备移除的 worker 节点上执行

# 只在 worker 节点执行

[root@k8s-node01 ~]# kubeadm reset

 

在 master 节点上执行

# 只在 master 执行

[root@k8s-master ~]# kubectl delete node k8s-node01

node "k8s-node01" deleted

 

集群版本查看

执行如下命令即可

1 [root@k8s-master ~]# kubectl version

2 Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.4", GitCommit:"8d8aa39598534325ad77120c120a22b3a990b5ea", GitTreeState:"clean", BuildDate:"2020-03-12T21:03:42Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}

3 Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.4", GitCommit:"8d8aa39598534325ad77120c120a22b3a990b5ea", GitTreeState:"clean", BuildDate:"2020-03-12T20:55:23Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}

到这来,整个集群已经部署完毕,可以欢呼了!

 

部署 Dashboard

本次部署版本版本:v2.0.0-rc6。不能部署v1.10.0版本,因为该版本过低不匹配。

Dashboard 的GitHub地址:

https://github.com/kubernetes/dashboard/

 

版本选择

 

下载dashboard镜像

镜像下载脚本,在所有节点执行,因为dashboard会根据调度部署在任意节点。

脚本如下:

 1 [root@k8s-master k8s_install]# pwd

2 /root/k8s_install

3 [root@k8s-master k8s_install]# cat install_dashboard.sh

4 #!/bin/sh

5

6##### 在 master 节点和 worker 节点都要执行 【所有机器执行】

7

8# 加载环境变量

9 . /etc/profile

10 . /etc/bashrc

11

12###############################################

13# 从国内下载 k8s dashboard 所需镜像,并对镜像重命名

14 src_registry="registry.cn-beijing.aliyuncs.com/google_registry"

15# 定义镜像集合数组

16 # V1.17.x 版本对应的 dashboard 不能使用 dashboard:v1.10.1 该版本低,不匹配

17 images=(

18 dashboard:v2.0.0-rc6

19 metrics-scraper:v1.0.3

20)

21# 循环从国内获取的Docker镜像

22for img in ${images[@]};

23do

24 # 从国内源下载镜像

25 docker pull ${src_registry}/$img

26 # 改变镜像名称

27 docker tag ${src_registry}/$img kubernetesui/$img

28 # 删除源始镜像

29 docker rmi ${src_registry}/$img

30 # 打印分割线

31echo"======== $img download OK ========"

32done

33echo"********** k8s dashboard docker images OK! **********"

 

部署 Dashboard

在k8s-master上操作

获取dashboard的recommended.yaml

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc6/aio/deploy/recommended.yaml

 

修改recommended.yaml配置,如下:

 1 [root@k8s-master k8s_install]# pwd

2 /root/k8s_install

3 [root@k8s-master k8s_install]# vim recommended.yaml

4………………

5kind: Service

6apiVersion: v1

7metadata:

8 labels:

9 k8s-app: kubernetes-dashboard

10 name: kubernetes-dashboard

11 namespace: kubernetes-dashboard

12spec:

13 # 添加处

14 type: NodePort

15 ports:

16 - port: 443

17 targetPort: 8443

18 # 添加处

19 nodePort: 30001

20 selector:

21 k8s-app: kubernetes-dashboard

22………………

23 template:

24 metadata:

25 labels:

26 k8s-app: kubernetes-dashboard

27 spec:

28 containers:

29 - name: kubernetes-dashboard

30 image: kubernetesui/dashboard:v2.0.0-rc6

31 # 修改处 从 Always 改为了 IfNotPresent

32 #imagePullPolicy: Always

33 imagePullPolicy: IfNotPresent

34………………

35 spec:

36 containers:

37 - name: dashboard-metrics-scraper

38 image: kubernetesui/metrics-scraper:v1.0.3

39 # 添加如下行

40 imagePullPolicy: IfNotPresent

 

启动dashboard

kubectl apply -f recommended.yaml

 

查看dashboard运行情况

 1 [root@k8s-master ~]# kubectl get pods -A -o wide

2NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

3 kube-system coredns-6955765f44-kdcj7 1/1 Running 1 3h6m 10.244.0.5 k8s-master <none> <none>

4 kube-system coredns-6955765f44-v9pzk 1/1 Running 1 3h6m 10.244.0.4 k8s-master <none> <none>

5 kube-system etcd-k8s-master 1/1 Running 1 3h6m 172.16.1.110 k8s-master <none> <none>

6 kube-system kube-apiserver-k8s-master 1/1 Running 1 3h6m 172.16.1.110 k8s-master <none> <none>

7 kube-system kube-controller-manager-k8s-master 1/1 Running 1 3h6m 172.16.1.110 k8s-master <none> <none>

8 kube-system kube-flannel-ds-amd64-9nzhv 1/1 Running 1 167m 172.16.1.111 k8s-node01 <none> <none>

9 kube-system kube-flannel-ds-amd64-cft6f 1/1 Running 1 3h6m 172.16.1.110 k8s-master <none> <none>

10 kube-system kube-flannel-ds-amd64-sm7d7 1/1 Running 1 167m 172.16.1.112 k8s-node02 <none> <none>

11 kube-system kube-proxy-dprqm 1/1 Running 1 167m 172.16.1.112 k8s-node02 <none> <none>

12 kube-system kube-proxy-k9l5r 1/1 Running 1 3h6m 172.16.1.110 k8s-master <none> <none>

13 kube-system kube-proxy-mdfsl 1/1 Running 1 167m 172.16.1.111 k8s-node01 <none> <none>

14 kube-system kube-scheduler-k8s-master 1/1 Running 1 3h6m 172.16.1.110 k8s-master <none> <none>

15 kubernetes-dashboard dashboard-metrics-scraper-7b8b58dc8b-hr7lf 1/1 Running 0 93s 10.244.2.2 k8s-node02 <none> <none>

16 kubernetes-dashboard kubernetes-dashboard-755dcb9575-9c5h8 1/1 Running 0 93s 10.244.3.2 k8s-node01 <none> <none>

17 [root@k8s-master ~]#

18 [root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard -o wide # -n 指定namespace

19NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

20 dashboard-metrics-scraper-7b8b58dc8b-hr7lf 1/1 Running 0 2m50s 10.244.2.2 k8s-node02 <none> <none>

21 kubernetes-dashboard-755dcb9575-9c5h8 1/1 Running 0 2m50s 10.244.3.2 k8s-node01 <none> <none>

 

查看services服务信息

 1 # 或则使用 kubectl get svc -A

2 [root@k8s-master ~]# kubectl get services --all-namespaces

3 NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

4 default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h19m

5 kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3h19m

6 kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.104.251.180 <none> 8000/TCP 4m55s

7 kubernetes-dashboard kubernetes-dashboard NodePort 10.111.61.235 <none> 443:30001/TCP 4m55s

8 [root@k8s-master ~]#

9 # 或则使用 kubectl get svc -n kubernetes-dashboard

10 [root@k8s-master ~]# kubectl get services --namespace=kubernetes-dashboard

11 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

12 dashboard-metrics-scraper ClusterIP 10.104.251.180 <none> 8000/TCP 5m13s

13 kubernetes-dashboard NodePort 10.111.61.235 <none> 443:30001/TCP 5m13s

 

浏览器访问

根据规划,访问如下地址:

https://172.16.1.110:30001/

 

如果谷歌浏览器不能打开,参见如下博文:解决Google浏览器不能打开kubernetes dashboard方法【转】

https://blog.csdn.net/weixin_30535043/article/details/102395724

  

也可以使用火狐浏览器打开,浏览器添加例外后,访问得到如下页面:

 

使用令牌登录(需要创建能够访问 Dashboard 的用户)

创建service account并绑定默认cluster-admin管理员集群角色

 1 [root@k8s-master k8s_install]# pwd

2 /root/k8s_install

3 [root@k8s-master k8s_install]# cat account.yaml

4# Create Service Account

5apiVersion: v1

6kind: ServiceAccount

7metadata:

8 name: admin-user

9 namespace: kube-system

10 ---

11# Create ClusterRoleBinding

12 apiVersion: rbac.authorization.k8s.io/v1

13kind: ClusterRoleBinding

14metadata:

15 name: admin-user

16roleRef:

17 apiGroup: rbac.authorization.k8s.io

18 kind: ClusterRole

19 name: cluster-admin

20subjects:

21 - kind: ServiceAccount

22 name: admin-user

23 namespace: kube-system

24 [root@k8s-master k8s_install]# kubectl apply -f account.yaml # 执行 yaml 文件

 

查看绑定信息

1 [root@k8s-master k8s_install]# kubectl get clusterrolebinding

2NAME AGE

3 admin-user 58s

4 cluster-admin 5h47m

5flannel 5h45m

6 kubeadm:kubelet-bootstrap 5h47m

7 kubeadm:node-autoapprove-bootstrap 5h47m

8 kubeadm:node-autoapprove-certificate-rotation 5h47m

9 ………………

 

获取tocken

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | grep admin-user | awk"{print $1}")

 

 

将得到的token信息用于访问,结果如下:【可能需要等几分钟页面才能刷出来】

 

完毕!

 


 

 

———END———
如果觉得不错就关注下呗 (-^O^-) !

 

原文链接:https://www.cnblogs.com/zhanglianghhh/archive/2020/07/29/13399816.html

以上是 基于kubeadm快速部署kubernetesK8SV1.17.4集群无坑完整版 的全部内容, 来源链接: utcz.com/z/518862.html

回到顶部