#部署方式有多种,本文采用kubeadm组件的方式来部署K8s集群
安装要求:
- 至少三台主机
- 内存最少2G,CPU2核
- 集群网络互通
- 可以访问外网
- 禁止swap分区
环境说明:
系统:ubuntu22.04.1
版本信息:kubernetes:1.26.2 ,docker-ce:23.0.1 ,cri-docker:0.3.1
ip及节点概况:master:10.0.0.200,node1:10.0.0.201,node2:10.0.0.202
部署前的准备:
#以下操作在全部节点上都要执行
1.设定时钟同步
apt install -y chrony
systemctl start chrony.service
2.设置主机名称解析
vim /etc/hosts
10.0.0.200 k8s-master.zhang.com
10.0.0.201 k8s-node1.zhang.com
10.0.0.202 k8s-node2.zhang.com
3.禁用swap设备
1)关闭当前已启用的所有Swap设备
swapoff -a
2)编辑/etc/fstab,注释用于挂载swap设备的所有行,然后保存退出
3)可以用free命令查看swap的使用情况,为0即可
4.禁用防火墙服务
ufw disable
ufw status
部署k8s集群:
-
安装相关组件
1.部署docker
阿里云官方配置说明
#首先,生成docker-ce相关程序包的仓库,这里以阿里云的镜像服务器为例进行说明:
1)安装docker
apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt -y install docker-ce
2)添加配置
#kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容,其中的registry-mirrors用于指明使用的镜像加速服务
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "200m"
},
"storage-driver": "overlay2"
}
3)配置完成后即可启动docker服务,并将其设置为随系统启动而自动引导
systemctl daemon-reload;systemctl start docker.service;systemctl enable docker.service
2.安装cri-docker
#GitHub网站可能需要科学上网才能访问
curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd_0.3.1.3-0.ubuntu-jammy_amd64.deb
apt install -y ./cri-dockerd_0.3.1.3-0.ubuntu-jammy_amd64.deb
systemctl status cri-docker.service
3.安装kubelet、kubeadm和kubectl
阿里云官方配置说明
#首先,在各主机上生成kubelet和kubeadm等相关程序包的仓库,这里以阿里云的镜像服务为例:
apt update && apt install -y apt-transport-https curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt update
apt install -y kubelet kubeadm kubectl
systemctl enable kubelet
#安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号
-
整合kubelet和cri-dockerd
1.配置cri-dockerd
#确保其能够正确加载到CNI插件,编辑/usr/lib/systemd/system/cri-docker.service文件,确保其[Service]配置段中的ExecStart的值类似如下内容:
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d
需要添加的各配置参数说明(各参数的值要与系统部署的CNI插件的实际路径相对应):
-
--network-plugin:指定网络插件规范的类型,这里要使用CNI;
-
--cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;
-
--cni-cache-dir:CNI插件使用的缓存目录;
-
--cni-conf-dir:CNI插件加载配置文件的目录;
配置完成后,重载并重启cri-docker.service服务:
systemctl daemon-reload;systemctl restart cri-docker.service
2.配置kubelet
#配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“。编辑文件/etc/sysconfig/kubelet(若/etc/sysconfig目录不存在,则需要先创建该目录),为其添加 如下指定参数:
mkdir /etc/sysconfig
vim /etc/sysconfig/kubelet
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"
#需要说明的是,该配置也可不进行,而是直接在后面的各kubeadm命令上使用“--cri-socket unix:///run/cri-dockerd.sock”选项
-
初始化master节点
#需要说明的是由kubeadm部署的Kubernetes集群上,集群核心组件kube-apiserver、kube-controller-manager、kube-scheduler和etcd等均会以静态Pod的形式运行,它们所依赖的镜像文件默认来自于registry.k8s.io这一Registry服务之上。但我们无法直接访问该服务,常见的解决方案有两种,1是使用能够达到该服务的代理服务,2是使用国内的镜像服务器上的服务,例如:registry.aliyuncs.com/google_containers等
kubeadm init \
--control-plane-endpoint="k8s-master.zhang.com" \
--kubernetes-version=v1.26.2 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--token-ttl=0 \
--cri-socket unix:///run/cri-dockerd.sock \
--upload-certs \
--image-repository=registry.aliyuncs.com/google_containers
命令中各选项的说明:
-
--image-repository:指定要使用的镜像仓库,默认为registry.k8s.io;
-
--kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同;
-
--control-plane-endpoint:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;
-
--pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;
-
--service-cidr:Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址;
-
--apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址;
-
--token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。kubeadm token create --print-join-command
-
初始化后的操作
下面是系统给的提示:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of the control-plane node running the following command on each as root:
kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
--discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 \
--control-plane --certificate-key 2ca266fb50ac46f0bc7852fe83295cfc582d2ac25f36d06708c289cd4ebb0886Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
--discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8
我们可以按照系统给的提示来执行:
1.Kubernetes集群管理员认证到Kubernetes集群时使用的kubeconfig配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#下面定义环境变量的方法也可:
export KUBECONFIG=/etc/kubernetes/admin.conf
2.部署网络插件(此步在所有节点执行)
mkdir /opt/bin/
curl -L https://github.com/flannel-io/flannel/releases/download/v0.21.2/flanneld-amd64 -o /opt/bin/flanneld
chmod +x /opt/bin/flanneld
#向Kubernetes部署kube-flannel,(下面一步在master节点执行):
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml
用下面命令确认pod的状态为"Running",即kube-flannel已正常运行:
kubectl get pods -n kube-flannel
3.用下面命令验证master节点已经就绪
kubectl get nodes
-
添加节点至集群中
1.使用系统给的提示中的kubeadm join命令
#需要说明的是,每个节点的token值都是不一样的,不要复制我这里的,看系统给的提示;
选项--cri-socket unix:///run/cri-dockerd.sock需要额外加上
kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
--discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 \
--cri-socket unix:///run/cri-dockerd.sock
2.使用下面命令验证节点添加结果
kubectl get nodes
-
测试应用编排及服务访问
#我们部署一个nginx来进行测试
1.创建Deployment部署Nginx
kubectl create deployment nginx --image=nginx:1.22-alpine --replicas=1
kubectl get pods
2.创建Service暴露Nginx
kubectl create service nodeport nginx --tcp=80:80
kubectl get service
nginx集群外部的访问端口是30799,我们就可以通过http://10.0.0.200:30799进行访问: