从零开始部署Kubernetes v1.17.1集群(三)部署W
2020-01-31 本文已影响0人
浮云_9046
安装Kubernetes Worker节点
我们将安装1个Master 3个Worker节点的Kubernetes群集,本节内容包括安装三个Worker节点。
目录
- 从零开始部署Kubernetes v1.17.1集群(一) 安装Centos 7
- 从零开始部署Kubernetes v1.17.1集群(二) 部署Master节点
- 从零开始部署Kubernetes v1.17.1集群(三) 部署Worker节点
- 从零开始部署Kubernetes v1.17.1集群(四) 部署可视化管理工具
环境
- 操作系统:Centos7
- master:192.168.1.20
- worker1:192.168.1.21
- worker2:192.168.1.22
- worker3:192.168.1.23
安装Centos 7
请从第一篇安装好的虚拟机基础上进行后续操作。
检查系统信息
查看操作系统的version、hostname、cpu信息,后面很多地方需要用到hostname
,提前了解做到心中有数。如果名称不方便记忆可以自行修改。
# 查看操作系统版本。在 master 节点和 worker 节点都要执行
cat /etc/redhat-release
# 我的输出是:CentOS Linux release 7.7.1908 (Core)
# 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
# 不能使用 localhost 作为节点的名字
hostname
# 请使用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64 本安装文档不支持 arm 架构
# CPU(s): 2 CPU 内核数量不能低于 2
lscpu
修改hostname
需要在三个worker节点上分别设置名称。
- k8s-worker1
- k8s-worker2
- k8s-worker3
# 修改 hostname, 把"k8s-worker1"改成你喜欢的名字
sudo hostnamectl set-hostname k8s-worker1
# 查看修改结果
hostnamectl status
# 设置 hostname 解析,这个命令需要root账户才能执行,sudo都不行。
echo "127.0.0.1 $(hostname)" >> /etc/hosts
检查网络
$ ip route
default via 10.87.10.1 dev eth0 proto dhcp metric 100
10.87.10.0/24 dev eth0 proto kernel scope link src 10.87.10.138 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:00:c9:0b brd ff:ff:ff:ff:ff:ff
inet 10.87.10.138/24 brd 10.87.10.255 scope global
...
kubelet使用的IP地址
ip route show
命令中,可以知道机器的默认网卡,通常是 eth0
,如 default via 10.87.10.1 dev eth0
ip address
命令中,可显示默认网卡的 IP 地址,Kubernetes 将使用此 IP 地址与集群内的其他节点通信,如 10.87.10.138
所有节点上 Kubernetes 所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)
安装Worker
安装Docker和kubelet
将以下内容保存为install.sh
。
#!/bin/bash
# 在 master 节点和 worker 节点都要执行
# 安装 docker
# 参考文档如下
# https://docs.docker.com/install/linux/docker-ce/centos/
# https://docs.docker.com/install/linux/linux-postinstall/
# 卸载旧版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
# 设置 yum repository
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装并启动 docker
yum install -y docker-ce-${1} docker-ce-cli-${1} containerd.io
systemctl enable docker
systemctl start docker
# 安装 nfs-utils
# 必须先安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils
yum install -y wget
# 关闭 防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
# 修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p
# 配置K8S的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 卸载旧版本
yum remove -y kubelet kubeadm kubectl
# 安装kubelet、kubeadm、kubectl
yum install -y kubelet-${2} kubeadm-${2} kubectl-${2}
# 修改docker Cgroup Driver为systemd
# # 将/usr/lib/systemd/system/docker.service文件中的这一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# # 修改为 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
# 如果不修改,在添加 worker 节点时可能会碰到如下错误
# [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
# Please follow the guide at https://kubernetes.io/docs/setup/cri/
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
# 设置 docker 镜像,提高 docker 镜像下载速度和稳定性
# 如果您访问 https://hub.docker.io 速度非常稳定,亦可以跳过这个步骤
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet
docker version
运行安装install.sh
的脚本,后面的两个参数分别是docker和kubernetes的版本号,根据需要修改。
在这里查看Docker发布的版本号,查看Kubernetes版本号。
sudo sh ./install.sh 19.03.5 1.17.1
安装Worker节点的服务
初始化worker
如果有多个worker节点每个都要执行。
注意: 这段代码请su
切换到root
账户下执行。
# 只在 worker 节点执行
# 替换 192.168.1.20 为 master 节点的内网 IP
export MASTER_IP=192.168.1.20
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.k8s.com
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
在master
节点上执行获得 join
命令参数
# 在 master 节点执行
kubeadm token create --print-join-command
# 输出
kubeadm join apiserver.k8s.com --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
有效时间
该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点。
将kubeadm token create
输出的结果复制到其它worker
节点上执行。
# 在 worker 节点上 执行上一步命令的输出
kubeadm join apiserver.k8s.com --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
检查初始化结果
在master
节点查看所有节点状态,大约1分钟左右就能看到所有节点已经Ready
。
# 只在 master 节点执行
kubectl get nodes -o wide
# 输出结果如下所示:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready master 36h v1.17.1 192.168.1.20 <none> CentOS Linux 7 (Core) 3.10.0-1062.9.1.el7.x86_64 docker://18.9.7
k8s-worker1 Ready <none> 6m28s v1.17.1 192.168.1.21 <none> CentOS Linux 7 (Core) 3.10.0-1062.9.1.el7.x86_64 docker://19.3.5
k8s-worker2 Ready <none> 6m4s v1.17.1 192.168.1.22 <none> CentOS Linux 7 (Core) 3.10.0-1062.9.1.el7.x86_64 docker://19.3.5
k8s-worker3 Ready <none> 6m2s v1.17.1 192.168.1.23 <none> CentOS Linux 7 (Core) 3.10.0-1062.9.1.el7.x86_64 docker://19.3.5