用途:学习Kubernetes知识点,使用kubeadm搭建单Master,双Node集群。
说明:生产环境,是不可以做单Master集群的,若出现单点故障,整个集群无法运行。生产环境,一般会做多Master集群。

节点 系统 配置 IP
master centos7.9 2核2G,40G 192.168.0.120
node1 centos7.9 2核2G,40G 192.168.0.121
node2 centos7.9 2核2G,40G 192.168.0.122

说明:Kubernetes和Docker之间的版本关系https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
Kubernetes-1.23和Docker-20.10
备注:下面步骤,若无特殊说明,需在master和node节点都执行。

第一章 环境准备

1.1 升级内核[可选]

  1. # 查看系统版本
  2. $ cat /etc/redhat-release
  3. # 查看内核版本
  4. $ uname -r
  5. # 启用ELRepo仓库
  6. $ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  7. $ rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
  8. # 查看可用的系统内核相关包
  9. $ yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
  10. # 安装主线内核
  11. $ yum -y --enablerepo=elrepo-kernel install kernel-ml
  12. # 备份配置
  13. $ cp /etc/default/grub /etc/default/grub_bak
  14. # 修改配置
  15. $ vim /etc/default/grub
  16. GRUB_DEFAULT=0 # 修改此处,原来是 saved
  17. # 重新创建内核配置
  18. $ grub2-mkconfig -o /boot/grub2/grub.cfg
  19. # 重启
  20. $ reboot
  21. # 查看内核版本
  22. $ uname -r

1.2 修改hostname

# 在master节点
$ hostnamectl --static set-hostname k8s-master
# 在node1节点
$ hostnamectl --static set-hostname k8s-node1
# 在node2节点
$ hostnamectl --static set-hostname k8s-node2

1.3 添加hosts解析

$ cat >> /etc/hosts <<EOF
192.168.0.120 k8s-master
192.168.0.121 k8s-node1
192.168.0.122 k8s-node2
EOF

1.4 配置yum源

# 使用阿里yum源
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
$ wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
$ yum clean all
$ yum makecache
$ yum repolist

1.5 关闭swap

原因:当k8s集群内存不够用时,会使用swap分区,集群性能会下降。当性能下降很多时,集群会认为节点挂掉,会重新选举节点。当节点恢复正常时,可能会重新选择该节点,然后又因为内存不足使用swap导致性能下降。如此往复,最后会拖垮整个k8s集群。

$ swapoff -a
$ sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

1.6 禁用防火墙

原因:Kubernetes和docker在运行时会产生大量的iptables规则,为了不让系统规则跟它们混淆,这里关闭系统防火墙。
注意:生产上谨慎关闭防火墙

$ systemctl stop firewalld && systemctl disable firewalld
$ systemctl stop iptables && systemctl disable iptables

1.7 禁用selinux

# 修改后,需重启服务器
$ vi /etc/selinux/config
SELINUX=disabled

$ setenforce 0
$ sed -i 's/enforcing/disabled/' /etc/selinux/config

1.8 修改内核参数

# 修改内核,添加网桥过滤和地址转发功能
$ cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
vm.swappiness=0
EOF
# 重新加载内核配置
$ sysctl -p [/etc/sysctl.d/k8s.conf]
# 加载网桥过滤模块
$ modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
$ lsmod | grep br_netfilter

1.9 配置ipvs功能

原因:在Kubernetes中service代理,一种基于iptables,一种基于ipvs,ipvs性能更好。若要使用ipvs,要手动载入ipvs模块。

# 安装ipset和ipvsadmin
$ yum install -y ipset ipvsadmin
# 添加需要加载的模块写入脚本文件
$ cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 为脚本添加执行权限
  $ chmod 755 /etc/sysconfig/modules/ipvs.modules
# 执行脚本
$ /bin/bash /etc/sysconfig/modules/ipvs.modules
# 查看对应模块是否加载成功
$ lsmod | grep -e ip_vs -e nf_conntrack_ipv4

1.10 设置时间同步

$ systemctl enable chronyd
$ systemctl start chronyd
# 查看时区
$ timedatectl
# 设置时区
$ timedatectl set-timezone Asia/Shanghai
# 开启同步
$ timedatectl set-ntp true

1.11 安装docker

# 配置docker yum源
$ yum install -y yum-utils
$ yum-config-manager --add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum makecache
$ yum repolist

# 安装docker
$ yum list docker-ce --showduplicates | sort -r
# 安装docker最新版本
$ yum install -y docker-ce docker-ce-cli containerd.io
# 安装docker指定版本
$ yum install -y --disableexcludes=docker-ce docker-ce-20.10.12

# 配置docker加速
# docker默认使用的Cgroup Driver为cgroupfs,k8s推荐使用systemd代替cgroupfs
$ mkdir -p /etc/docker
$ cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://0falwrlx.mirror.aliyuncs.com"]
}
EOF
$ systemctl enable docker
$ systemctl start docker

1.12 安装Kubernetes组件

# 配置yum源
$ cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[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 makecache
$ yum repolist

# 安装Kubernetes组件
# --disableexcludes 禁掉除了kubernetes之外的别的仓库
$ yum install -y --disableexcludes=kubernetes \
kubeadm-1.19.8 kubectl-1.19.8 kubelet-1.19.8
$ yum install -y --setopt=obsoletes=0 \
kubeadm-1.19.8 kubectl-1.19.8 kubelet-1.19.8

# 配置kubelet的cgroup
# 编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

# 设置kubelet开机启动
$ systemctl enable kubelet

第二章 集群初始化

2.1 准备集群镜像

# 所需要的镜像通过该命令
$ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.19.16
k8s.gcr.io/kube-controller-manager:v1.19.16
k8s.gcr.io/kube-scheduler:v1.19.16
k8s.gcr.io/kube-proxy:v1.19.16
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0

images=(kube-apiserver:v1.19.16 \
kube-controller-manager:v1.19.16 \
kube-scheduler:v1.19.16 \
kube-proxy:v1.19.16 \
pause:3.2 \
etcd:3.4.13-0 \
coredns:1.7.0)

for imageName in ${images[@]} ; do
  docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
  docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
  docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done

2.2 初始化集群

$ kubeadm init \
--kubernetes-version=v1.19.16 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.0.120

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

2.3 将node节点加入集群

$ kubeadm join 192.168.0.120:6443 \
--token xxxxx \
--discovery-token-ca-cert-hash sha256:xxxxx

2.4 查看集群

$ kubectl get nodes
# 显示NotReady状态,是因为没有安装网络插件

第三章 网络插件安装

Kubernetes支持多种网络插件,如flannel、calico、canal等,这里选择flannel。
插件使用的是DaemonSet的控制器,它会在每个节点上运行。kube-flannel.zip

# 一般不能直接下载flannel.yaml
# 下载flannel.yaml后,删除即可
$ cat >> /etc.hosts <<EOF
199.232.68.133 raw.githubusercontent.com
EOF

# 获取fannel配置文件
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

$ vi kube-flannel.yml
# 将quay.io改为quay-mirror.qiniu.com

# 使用配置文件启动fannel
$ kubectl apply -f kube-flannel.yml

# 查看CNI网络插件部署进度
$ kubectl get pods -n kube-system

# 稍等片刻,再次查看集群节点的状态
$ kubectl get nodes

# 查看集群健康状况
$ kubectl get cs

# 查看集群信息
$ kubectl cluster-info

第四章 集群测试

# 创建一个Nginx服务
$ kubectl create deployment nginx --image=nginx:1.14-alpine
# 暴露端口
$ kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务
$ kubectl get pods,svc
# 说明:此处,通过30871端口,访问Nginx

image.png

第五章 Kubectl自动补全

5.1 安装bash-completion

# 检查bash-completion是否安装
$ type _init_completion
# 安装bash-completion
$ yum(apt-get) install bash-completion
# 将下面内容添加到~/.bashrc中
$ source /usr/share/bash-completion/bash_completion
# 验证bash-completion的安装状态
$ type _init_completion

5.2 启用Kubectl自动补全功能

# 系统全局
$ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
# 当前用户
$ echo 'source <(kubectl completion bash)' >>~/.bashrc
# 执行后,重新加载shell即可生效(或重新登录会话)