一.简介
1.k8s和相关组件之前写的博客有简单介绍,https://blog.51cto.com/alibaby/11305601
如果docker是船,那么k8s就是这只船的舵手,k8s是建立在容器之上的技术之一,只为容器打造的集群管理工具,具有包括自动修复、弹性伸缩、自动调度、自动重启、自动备份、自动上线和版本回滚,服务发现和负载均衡等,在k8s世界里,一切皆容器。
2.k8s历史版本不完全统计
大概每3-4月发布一个版本,版本xyz: x主要版本,y次要版本,z补丁版本。k8s与docker无严格对应关系,对应为部署兼容。
2024年:1.30
2023年:1.27 1.28 1.29 对应docker版本 20.10.x或更高
2022年:1.24 1.25 1.26 对应docker版本 20.10.x或更高
2021年:1.21 1.22 1.23 对应docker版本 20.10.x或更高
2020年:1.18 1.19 1.20 对应docker版本18.09x 19.03x 20.10.x
2019年:1.14 1.15 1.16 1.17 对应docker版本1.13.x 17.03.x 18.06.x 19.03.x(1.16/1.17)
3.部署方式 从简单到复杂
yum部署---单机部署Minikube---自动化部署测试版kubeadm ---手动二进制部署---源码编译部署
二.kubeadm方式部署
1.资源分配 centos7.4
master | 192.168.77.135 | 4C 2G |
node1 | 192.168.77.136 | 4C 2G |
node2 | 192.168.77.137 | 4C 2G |
node3 | 192.168.77.138 | 4C 2G |
2.虚拟机准备,以下步骤k8s所有节点执行
关闭swap分区。
临时关闭
swapoff -a && sysctl -w vm.swappiness=0
永久关闭
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
检查各个节点MAC地址或product_uuid,虚拟机可能会不一样。
ifconfig ens33 | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid
检查所有节点之间的网络,要互通。
允许iptable检查桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
检查docker的环境
配置docker源,查看可安装的软件包,
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates
安装指定的docker版本docker-ce-20.10.24
yum -y install docker-ce-20.10.24 docker-ce-cli-20.10.24
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
配置docker优化
mkdir -pv /etc/docker && cat <<EOF | tee /etc/docker/daemon.json
{
"registry-mirrors": ["https://4hmfxnwg.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
将harbor服务器的客户端证书拷贝到k8s集群的所有节点 harbor搭建参考
#k8s所有节点创建自建证书目录
mkdir -pv /etc/docker/certs.d/alibaby007.com
cd /etc/docker/certs.d/alibaby007.com
scp root@192.168.77.133:/etc/docker/certs.d/alibaby007.com/alibaby007.com.crt .
配置docker开机自启动
systemctl enable --now docker
systemctl status docker
禁用防火墙
systemctl disable --now firewalld
禁用selinux
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
配置host解析
cat > /etc/hosts << EOF
192.168.77.135 master
192.168.77.136 node1
192.168.77.137 mode2
192.168.77.138 mode3
192.168.77.133 alibaby007.com
EOF
cat /etc/hosts
k8s所有节点验证是否能够登录harbor仓库
docker login -u admin -p Harbor12345 alibaby007.com
3.所有节点安装kubeadm,kubelet,kubectl
配置Kubernetes软件源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
查看kubeadm的版本(安装K8S的所有组件版本均要保持一致!)
yum -y list kubeadm --showduplicates
安装kubeadm,kubelet,kubectl软件包 已下载的安装地址
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0
启动kubelet服务(kubelet启动失败正常,会自动重启,因缺配置文件,初始化集群后恢复!)参考链接
systemctl enable --now kubelet
systemctl status kubelet
4.初始化control-plane/master节点
使用kubeadm初始化master节点,初始化成功后有一些提示信息需要操作
#仅master节点操作
kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16 --service-dns-domain=alibaby007.com
相关参数说明:
--kubernetes-version:
指定K8S master组件的版本号。
--image-repository:
指定下载k8s master组件的镜像仓库地址。
--pod-network-cidr:
指定Pod的网段地址。
--service-cidr:
指定SVC的网段。
--service-dns-domain:
指定service的域名。若不指定,默认为"cluster.local"。
使用kubeadm初始化集群时,可能会出现如下的输出信息:
[init]
使用初始化的K8S版本。
[preflight]
主要是做安装K8S集群的前置工作,比如下载镜像,这个时间取决于你的网速。
[certs]
生成证书文件,默认存储在"/etc/kubernetes/pki"目录哟。
[kubeconfig]
生成K8S集群的默认配置文件,默认存储在"/etc/kubernetes"目录哟。
[kubelet-start]
启动kubelet,
环境变量默认写入:"/var/lib/kubelet/kubeadm-flags.env"
配置文件默认写入:"/var/lib/kubelet/config.yaml"
[control-plane]
使用静态的目录,默认的资源清单存放在:"/etc/kubernetes/manifests"。
此过程会创建静态Pod,包括"kube-apiserver","kube-controller-manager"和"kube-scheduler"
[etcd]
创建etcd的静态Pod,默认的资源清单存放在:""/etc/kubernetes/manifests"
[wait-control-plane]
等待kubelet从资源清单目录"/etc/kubernetes/manifests"启动静态Pod。
[apiclient]
等待所有的master组件正常运行。
[upload-config]
创建名为"kubeadm-config"的ConfigMap在"kube-system"名称空间中。
[kubelet]
创建名为"kubelet-config-1.22"的ConfigMap在"kube-system"名称空间中,其中包含集群中kubelet的配置
[upload-certs]
跳过此节点,详情请参考”--upload-certs"
[mark-control-plane]
标记控制面板,包括打标签和污点,目的是为了标记master节点。
[bootstrap-token]
创建token口令,例如:"kbkgsa.fc97518diw8bdqid"。
如下图所示,这个口令将来在加入集群节点时很有用,而且对于RBAC控制也很有用处哟。
[kubelet-finalize]
更新kubelet的证书文件信息
[addons]
添加附加组件,例如:"CoreDNS"和"kube-proxy”
拷贝授权文件,用于管理K8S集群
#master节点
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看master组件状态componentstatuses
#master节点
kubectl get cs
5.配置所有worker节点加入k8s集群
#在node1-3上分别执行
kubeadm join 192.168.77.135:6443 --token 0cwies.1jh356dfk6c9ibbo --discovery-token-ca-cert-hash sha256:9eda62185ddbaa49e10cd586ba6404108c82e1affd9260320baf8a5444427444
查看现有的节点状态
#master节点
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 34m v1.23.17
node1 NotReady <none> 2m56s v1.23.17
node2 NotReady <none> 3m6s v1.23.17
node3 NotReady <none> 3m42s v1.23.17
6.添加kubectl的自动补全功能
#master节点
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
已准备好的kube-flannel镜像和kube-flannel.yml
#将flannel.tar.gz上传至集群各个节点,然后导入
docker load -i flannel.tar.gz
#将kube-flannel.yml上传至master节点后执行
kubectl apply -f kube-flannel.yml
下面这部分可不看
#master节点执行
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#修改配置文件并应用
sed -i 's/10.244.0.0/10.100.0.0/g' kube-flannel.yml
kubectl apply -f kube-flannel.yml
#可能flannel会拉取失败,报错Init:ImagePullBackOff
kubectl get pods -A
#将提前下载好的docker load导入
docker load -i flannel.tar.gz
kubectl delete -f kube-flannel.yml
kubectl apply -f kube-flannel.yml
安装flanne(值得注意的是,如果你的Pod网络和我的不一样"10.100.0.0/16",请自行修改配置文件)
检查flannel组件是否正常,均处于"Running"状态!
#master节点
kubectl get pods -A -o wide| grep kube-flannel
[root@master ~]# kubectl get pods -A -o wide| grep kube-flannel
kube-flannel kube-flannel-ds-28pw6 1/1 Running 0 45m 192.168.77.138 node1 <none> <none>
kube-flannel kube-flannel-ds-k6vrf 1/1 Running 0 45m 192.168.77.137 node2 <none> <none>
kube-flannel kube-flannel-ds-mzdpj 1/1 Running 0 45m 192.168.77.135 master <none> <none>
kube-flannel kube-flannel-ds-rtqr7 1/1 Running 0 45m 192.168.77.136 node3 <none> <none>