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处回车

输入用户名、计算机名、密码等信息,根据课程安排,你的计算机名必须是如下所述:

  1. 第一台:yl-master
  2. 第二台:yl-worker1
  3. 第三台: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

  1.  Docker、CRI-Docker 部署
  2. Swap 分区关闭
  3. iptables 桥接流量的允许
  4. 安装kubeadm等软件
  5. 集成CRI-Docker
  6. 所有节点的/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

使用PVPVC

创建一个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:

THE END