kubernetes集群安装部署
资料下载
ISO 下载地址:从以下链接下载文件:ubuntu-20.04.6-live-server-amd64.iso
http://mirrors.aliyun.com/ubuntu-releases/20.04.6/ubuntu-20.04.6-live-server-amd64.iso
VMware Workstation下载地址:
https://www.vmware.com/go/getworkstation-win
虚拟机
配置虚拟机网络
为了方便沟通,请确保和我的网络设定一致,在VMware软件左上角打开如下图所示
默认无法修改,请点击更改设置,请在弹出框中,点击“是”
点击vmnet8,并确保vmnet8是nat类型,输入子网192.168.206.0,掩码255.255.255.0
新建虚拟机
请注意,本次K8S集群部署至少需要3台虚拟机,新建虚拟机和安装系统步骤,请做3台虚拟机,而不要克隆。
安装好VMware软件之后,打开软件,点击菜单中的文件---新建
点击下一步
选择稍后安装系统
选择Linux---Ubuntu 64位
命名虚拟机名称
点击第一个选项,并在磁盘处输入200G
点击完成
修改虚拟机配置
根据你的电脑性能修改虚拟机配置,推荐每台虚拟机的配置为4核心4G内存,如果你有更好的配置,请自行修改,但不要小于2G内存,请注意在DVD处,选择自己下载好的ISO镜像,并确保勾选在启动时连接
为避免安装时间过长,请在安装之前,断开VMware 网络连接,并在安装完成后,重新将其链接上恢复网络能力
操作系统安装
系统安装
在修改好虚拟机配置之后,点击打开虚拟机电源,稍等之后,会出现以下界面,请选择english,并回车
语言和键盘处,保持默认,done
网络处保持默认
无需proxy
mirror安装好之后再配置,直接done
磁盘处使用默认的整个硬盘,然后done
确认后直接done
确认数据会全部擦除,并在continue处回车
输入用户名、计算机名、密码等信息,根据课程安排,你的计算机名必须是如下所述:
- 第一台:yl-master
- 第二台:yl-worker1
- 第三台:yl-worker2
以下图上的主机名是随便取的一个,你的主机名必须符合上面描述的主机名要求
用空格来勾选SSH,后面我们用工具远程连接
很快会安装好,安装好之后,回车reboot now
在回车后,会让你在移除ISO或光盘后再次回车才能启动
重新使VMware 虚拟机恢复网络能力
设置root密码
用上面自己的用户名和密码登录后,输入sudo -i回车,输入自己的密码,并输入passwd root,给root用户设置密码,请注意,所有虚拟机的root密码,必须是aishu.cn123
使用SSH工具连接
推荐的工具下载链接如下,你也可以使用自己熟悉的
https://download.mobatek.net/2352023111832715/MobaXterm_Portable_v23.5.zip
设置永久静态IP地址
先确定接口名称,输入 ip a s 回车这里发现接口名称为ens33,临时地址为192.168.30.130
设置静态IP
直接在SSH工具上,全选复制粘贴即可将IP配置完成,如果使用SSH工具存在困难,以下任何需要粘贴的部分,可手工在服务器中vim修改具体文件
再次提醒,请注意,三台虚拟机的IP和主机名必须如下:
第一台:yl-master 对应的IP 为192.168.206.201
第二台:yl-worker1 对应的IP 为192.168.206.202
第三台:yl-worker2 对应的IP 为192.168.206.203
下面是举例yl-master配置IP方法,直接复制粘贴即可,第二台和第三台记得更换IP地址
cat > /etc/netplan/00-installer-config.yaml <<EOF
# This is the network config written by 'subiquity'
network:
renderer: networkd
ethernets:
ens32:
addresses:
- 192.168.206.201/24
routes:
- to: default
via: 192.168.206.2
nameservers:
addresses:
- 114.114.114.114
version: 2
EOF
netplan apply
配置OpenSSH-Server
开通root用户的ssh权限以方便我们远程,请确保3台虚拟机上都配置好了root的ssh登录,且密码为aishu.cn123,全选复制,然后在三台机器上粘贴
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart sshd
配置软件仓库加速
使用镜像加速,可以提高软件下载速度,在root权限下,输入以下内容,内容较多
南京大学
cp /etc/apt/sources.list /etc/apt/sources.list.bak
sed -i 's/^deb.*archive.ubuntu.com/deb https:\/\/mirror.nju.edu.cn/' /etc/apt/sources.list
apt update
安装VM Tools
apt install open-vm-tools -y
安装实用性工具包
apt install vim wget curl bash-completion -y
配置集群内部解析
全选复制,然后在三台机器上粘贴,注意不要有遗漏,3台机器都需要配置解析
cat >> /etc/hosts <<EOF
192.168.206.201 yl-master
192.168.206.202 yl-worker1
192.168.206.203 yl-worker2
EOF
制作虚拟机快照
在后期操作期间,如果系统损坏,可以用快照快速恢复到干净的系统状态,所以在完成上述所有步骤后,根据下图指示,给三台虚拟机分别做一个快照以备不时之需
输入快照名称以及合适的备注,名称和备注的内容可以自取,自己能分辨此快照中包含什么内容即可
按照上面的做法,记得分别给其他两台虚拟机也分别做一个快照,避免后期重装系统的麻烦
Docker CE 部署
准备所有机器的软件仓库(可选步骤)
Ubuntu 默认连接国外仓库,可能速度不太好,可以尝试换成国内的仓库加快速度,如果要做,建议在所有机器上都做一下
cat > /etc/apt/sources.list <<EOF
deb https://mirrors.aliyun.com/ubuntu focal main restricted
deb https://mirrors.aliyun.com/ubuntu focal-updates main restricted
deb https://mirrors.aliyun.com/ubuntu focal universe
deb https://mirrors.aliyun.com/ubuntu focal-updates universe
deb https://mirrors.aliyun.com/ubuntu focal multiverse
deb https://mirrors.aliyun.com/ubuntu focal-updates multiverse
deb https://mirrors.aliyun.com/ubuntu focal-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu focal-security main restricted
deb https://mirrors.aliyun.com/ubuntu focal-security universe
deb https://mirrors.aliyun.com/ubuntu focal-security multiverse
EOF
apt update
以下Docker CE和Containerd只需选一个即可,建议选Docker CE
添加Docker 仓库
这一步需要在所有机器上完成
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装Docker CE
这一步需要在所有机器上完成
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
添加Docker 镜像加速器
这一步需要在所有机器上完成
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tehurc7d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证镜像加速器成功添加与否,docker info | grep aliyun后,要出现aliyun链接才算成功
docker info | grep aliyun
部署完Docker CE之后,还需要cri-docker shim才可以和Kubernetes集成
CRI-Docker 部署
这一步需要在所有机器上完成
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.15/cri-dockerd_0.3.15.3-0.ubuntu-focal_amd64.deb
dpkg -i cri-dockerd_0.3.15.3-0.ubuntu-focal_amd64.deb
将镜像指引到国内
sed -i 's/ExecStart=.*/ExecStart=\/usr\/bin\/cri-dockerd --container-runtime-endpoint fd:\/\/ --network-plugin=cni --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com\/google_containers\/pause:3.9/' /lib/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl restart cri-docker.service
systemctl enable cri-docker.service
kubernetes 部署
关闭swap分区
这一步需要在所有机器上完成
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
允许 iptables 检查桥接流量
这一步需要在所有机器上完成
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
安装 kubeadm
这一步需要在所有机器上完成
apt-get update && apt-get install -y apt-transport-https curl
cat > /etc/apt/sources.list.d/k8s.list <<EOF
deb https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /
EOF
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key | apt-key add -
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
添加命令自动补齐功能
kubectl completion bash > /etc/bash_completion.d/kubectl
kubeadm completion bash > /etc/bash_completion.d/kubeadm
source /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubeadm
如果提示/etc/bash_completion.d/kubectl: No such file or directory 这个错误,用以下方式完成补齐功能,此时要注意用的是两个大于号的追加符号,只能执行一次
kubectl completion bash >> /root/.bashrc
kubeadm completion bash >> /root/.bashrc
source /root/.bashrc
集成CRI-Docker
这一步需要在所有机器上完成
crictl config runtime-endpoint unix:///run/cri-dockerd.sock
crictl images
集群部署
下方kubeadm.yaml中name字段必须在网络中可被解析,也可以将解析记录添加到集群中所有机器的/etc/hosts中
这个集群部署的操作只需要在master上执行即可
kubeadm config print init-defaults > kubeadm.yaml
sed -i 's/.*advert.*/ advertiseAddress: 192.168.206.201/g' kubeadm.yaml
sed -i 's/.*name.*/ name: yl-master/g' kubeadm.yaml
sed -i 's/imageRepo.*/imageRepository: registry.cn-hangzhou.aliyuncs.com\/google_containers/g' kubeadm.yaml
# 注意下面的替换,只有在集成的是CRI-Docker时才需要执行,而Containerd就不需要
sed -i 's/ criSocket.*/ criSocket: unix:\/\/\/run\/cri-dockerd.sock/' kubeadm.yaml
modprobe br_netfilter
kubeadm init --config kubeadm.yaml
出现下面的提示就是成功了,保存好join的命令
Your Kubernetes control-plane has initialized successfully!
...
kubeadm join 192.168.206.201:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2a1fadf64bc990ce5dadaf32538eb22183d0c74d186d3a805f088343d8757ea1
授权管理权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
部署Calico网络插件
这个Calico网络插件部署的操作只需要在master上执行即可
sudo docker pull docker.io/calico/cni:v3.25.0 #所有节点执行
sudo docker pull docker.io/calico/node:v3.25.0 #所有节点执行
sudo docker pull docker.io/calico/kube-controllers:v3.25.0 #所有节点执行
使用如下命令新增镜像加速地址、重新部署Calico插件不再报错
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io","https://p5lmkba8.mirror.aliyuncs.com","https://registry.docker-cn.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
配置 Docker:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=cgroupfs"],
"registry-mirrors": ["https://cyzzkyky.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"experimental": true,
"features": {
"buildkit": true
}
}
EOF
sudo systemctl daemon-reload
sudo systemctl enable docker --now
sudo systemctl status docker
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
查询集群组件是否工作正常,正常应该都处于running
kubectl get pod -A
加入Worker节点
加入节点操作需在所有的worker节点完成,这里要注意,Worker节点需要完成以下先决条件才能执行kubeadm join
- Docker、CRI-Docker 部署
- Swap 分区关闭
- iptables 桥接流量的允许
- 安装kubeadm等软件
- 集成CRI-Docker
- 所有节点的/etc/hosts中互相添加对方的解析
如果时间长忘记了join参数,可以在master节点上用以下方法获取
kubeadm token create
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
如果觉得查找命令太长,可以在master节点用以下方式生成新的token
kubeadm token create --print-join-command
如果有多个CRI对象,在worker节点上执行以下命令加入节点时,指定CRI对象,案例如下:
kubeadm join 192.168.206.201:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2a1fadf64bc990ce5dadaf32538eb22183d0c74d186d3a805f088343d8757ea1 \
--cri-socket=unix:///var/run/cri-dockerd.sock
在yl-master机器上执行以下内容给节点打上角色标签,yl-worker1 yl-worker2打上了worker标签
kubectl label nodes yl-worker1 yl-worker2 node-role.kubernetes.io/worker=
kubectl get nodes
Namespace
命令行创建
kubectl create namespace yanliang
kubectl get namespaces
YAML文件创建
cat > namespace.yml <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: aishu
EOF
kubectl create -f namespace.yml
kubectl get namespaces
创建带有namespace属性的资源
kubectl run nginx --image=nginx --namespace=yanliang
kubectl get pod -n yanliang
每次查询和创建资源都需要带--namespace=yanliang挺麻烦,可以设置默认值
kubectl config set-context --current --namespace=yanliang
kubectl config view | grep namespace:
kubectl get pod
删除namespace会删除其下所有资源,但是如果要删除已经切换为默认值的namespace时,可能会卡住,所以我们要先把默认值切换为其他,然后再删除
kubectl config set-context --current --namespace=default
kubectl delete namespaces yanliang aishu
Pod
Pod创建
一个Pod中只有一个业务容器
cat > pod.yml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: yanliangpod
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo "Hello, yanliang!" && sleep 3600']
restartPolicy: OnFailure
EOF
kubectl create -f pod.yml
kubectl get pod
kubectl logs yanliangpod
一个Pod中有多个业务容器
cat > multicontainer.yml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: pod
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo "Hello, yanliang!" && sleep 3600']
- name: httpd
image: httpd
ports:
- name: web
containerPort: 80
restartPolicy: OnFailure
EOF
kubectl create -f multicontainer.yml
kubectl get pod
kubectl get -f multicontainer.yml -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod 2/2 Running 0 66s 172.16.200.199 host1 <none> <none>
root@k8s-master:~# curl 172.16.200.199
<html><body><h1>It works!</h1></body></html>
修改Pod
直接修改yaml文件,然后执行以下命令
kubectl apply -f pod.yml
Pod 删除
kubectl delete pod --all会删除所有pod
kubectl delete pod --all
kubernetes 控制器
Deployment
使用nginx镜像创建具有3个副本的Deployment,并分配合适的属性
cat > deployment.yml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: yanliang
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
EOF
更新Deployment
将deployment的镜像更改一次
kubectl set image deployments/nginx-deployment nginx=nginx:1.16.1 --record
查看更新进度
kubectl rollout status deployment/nginx-deployment
回滚 Deployment
故意将镜像名称命名设置为 nginx:1.161 而不是nginx:1.16.1,发现永远无法更新成功,此时就需要回退
kubectl set image deployments/nginx-deployment nginx=nginx:1.161 --record
kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
查看历史版本
回退到版本2
kubectl rollout undo deployments/nginx-deployment --to-revision=2
kubectl rollout status deployment/nginx-deployment
伸缩 Deployment
将指定的deployment副本更改为5
kubectl scale deployments/nginx-deployment --replicas=5
kubectl get deployments.apps,replicasets.apps -l app=nginx
StatefulSet
使用nginx镜像,创建一个副本数为3的有状态应用,并挂载本地目录到容器中
Service 服务发现
用nginx镜像准备一个3副本的deployment作为后端,并开放80端口
cat > deployment-service.yml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: yanliang
name: nginx-deployment-servicetest
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
EOF
然后用kubectl expose的命令创建一个针对deployment的服务,并查询endpoint是否准备就绪
ClusterIP类型的Service
ClusterIP是默认的Service类型,对外提供8000端口,并把流量引流到具有app: nginx的后端80端口上
配置存储卷
持久卷概述
持久卷(PersistentVolume,PV)是集群中的一块存储,可以由管理员事先供应,或者 使用存储类(Storage Class)来动态供应。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样,也是使用 卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期 持久卷申请(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源
构建简易NFS服务器
在master上模拟一个nfs服务器,将本地的/nfsshare共享出来给所有人使用
apt install nfs-kernel-server -y
mkdir /nfsshare
chmod 777 /nfsshare -R
echo /nfsshare *(rw) >> /etc/exports
systemctl enable nfs-server --now
exportfs -rav
PV
创建一个名为nfspv大小为5Gi卷,并以ReadWriteOnce的方式申明,且策略为Recycle
在创建pv前,需要确保在3个节点上都安装了nfs客户端
PVC
使用PV和PVC
创建一个pod并尝试使用PVC
Helm 部署实践
官方网址 http://helm.sh
Helm安装
从仓库中安装软件
本次安装一个wordpress
root@yl-master:~# helm repo add azurerepo http://mirror.azure.cn/kubernetes/charts/
"azurerepo" has been added to your repositories
root@yl-master:~# helm search repo wordpress
NAME CHART VERSION APP VERSION DESCRIPTION
azurerepo/wordpress 9.0.3 5.3.2 DEPRECATED Web publishing platform for building...
root@yl-master:~# helm install wordpress azurerepo/wordpress
WARNING: This chart is deprecated
NAME: wordpress
LAST DEPLOYED: Sun Sep 8 15:34:32 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES: