从零开始部署Kubernetes v1.17.1集群(二)部署M
2020-01-31 本文已影响0人
浮云_9046
安装Kubernetes Master节点
我们将安装1个Master 3个Worker节点的Kubernetes集群。
目录
- 从零开始部署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
# 修改 hostname, 把"k8s-master"改成你喜欢的名字
sudo hostnamectl set-hostname k8s-master
# 查看修改结果
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 映射、无安全组或防火墙隔离)
安装Master
安装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
安装Master节点的服务
只在 master 节点执行。
以下内容保存为init_master.sh
#!/bin/bash
# 只在 master 节点执行
# 脚本出错时终止执行
set -e
if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
echo 当前POD_SUBNET=$POD_SUBNET
echo 当前APISERVER_NAME=$APISERVER_NAME
exit 1
fi
# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v${1}
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
serviceSubnet: "10.96.0.0/16"
podSubnet: "${POD_SUBNET}"
dnsDomain: "cluster.local"
EOF
# kubeadm init
# 根据您服务器网速的情况,您需要等候 3 - 10 分钟
kubeadm init --config=kubeadm-config.yaml --upload-certs
# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
# 安装 calico 网络插件
# 参考文档 https://docs.projectcalico.org/v3.10/getting-started/kubernetes/
echo "安装calico-3.10.2"
rm -f calico-3.10.2.yaml
wget https://kuboard.cn/install-script/calico/calico-3.10.2.yaml
sed -i "s#192\.168\.0\.0/16#${POD_SUBNET}#" calico-3.10.2.yaml
kubectl apply -f calico-3.10.2.yaml
运行init_master.sh
脚本,后面的参数是kubernates的版本号,根据需要修改。
注意: 这段代码请su
切换到root
账户下执行。
# 替换 192.168.1.20 为 master 节点的内网IP
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=192.168.1.20
# 替换 apiserver.k8s.cd.xunmei.com 为 您想要的 dnsName
export APISERVER_NAME=apiserver.k8s.com
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.11.0.0/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
# 最后的参数为kubernetes版本,要与上一步安装的一致。
sh ./init_master.sh 1.17.1
检查 master 初始化结果
等待初始化完成,这步耗时比较长耐心等待,我等了接近20分钟。
# 只在 master 节点执行
# 执行如下命令,等待 5-30 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
# 查看 master 节点初始化结果
kubectl get nodes -o wide
安装 Ingress Controller
# 只在 master 节点执行
kubectl apply -f https://kuboard.cn/install-script/v1.17.x/nginx-ingress.yaml
常用操作
防火墙
# firewall防火墙
# 1、查看firewall服务状态
systemctl status firewalld
# 2、查看firewall的状态
firewall-cmd --state
# 3、开启、重启、关闭、firewalld.service服务
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
#4、查看防火墙规则
firewall-cmd --list-all
#5、查询、开放、关闭端口
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
# 1、firwall-cmd:是Linux提供的操作firewall的一个工具;
# 2、--permanent:表示设置为持久;
# 3、--add-port:标识添加的端口;
网卡启用禁用
服务器内网和外网网卡都配置了DNS服务器,导致不能同时使用。下面是快速启用禁用网卡操作。
# ifup {interface} //启动网卡命令
# ifdown {interface} //禁用网卡命令
# 启动网卡eth0
sudo ifup eth0
# 禁用网卡eth0
sudo ifdown eth0