Debian11最小化部署k8s集群
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Debian11最小化部署k8s集群相关的知识,希望对你有一定的参考价值。
参考技术A查看 安装 kubeadm-准备工作 对 k8s 安装的基本要求:
( 整个部署环境全在virtualbox中实现 )
部署最小化 K8S 集群:master + node1 + node2
3台主机IP分别为 192.168.36.213 、 192.168.36.141 、 192.168.36.188 、,将起配置到 文件中,保证互相合一通:
确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter 。
为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1 :
参见 Debian11安装docker
参考 安装-kubeadm-kubelet-和-kubectl
防止版本误差太大出问题,锁定版本
添加开机启动
---------------以上使用 master 节点进行演示查看,其他节点操作均一致--------------------
在 master(192.168.36.213)节点上执行:
kubeadm init 命令参考
上面安装完后,会提示你输入如下命令,按顺序执行即可。
在 ndoe 节点分别执行这个命令:
默认 token 有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建 token ,操作如下:
上述操作成功之后回到 Master 节点,运行 kubectl get nodes 命令查看:
此时,虽然 Maste 节点可以检测到 node 节点,但 STATUS 都还是 NotReady 状态,这里需要看装 CNI节点来实现网络访问。 Kubernetes 的网络模型选择 :
各个节点状态已就绪
至此,一个简单的 k8s 集群系统安装、测试完成。
2kubernetes集群部署与应用编排
集群部署与应用编排
部署前提
使用kubeadm部署Kubernetes集群的前提条件
◼ 支持Kubernetes运行的Linux主机,例如Debian、RedHat及其变体等
◼ 每主机2GB以上的内存,以及2颗以上的CPU
◼ 各主机间能够通过网络无障碍通信
◼ 独占的hostname、MAC地址以及product_uuid,主机名能够正常解析
◼ 放行由Kubernetes使用到的各端口,或直接禁用iptables
◼ 禁用各主机的上的Swap设备
◼ 各主机时间同步
准备代理服务,以便接入k8s.gcr.io,或根据部署过程提示的方法获取相应的Image
kubernetes集群示例环境
OS: Ubuntu 20.04.2 LTS
Docker:20.10.21,CGroup Driver: systemd
Kubernetes:v1.25.3, CRI: cri-dockerd, CNI: Flannel
网络环境
◼ 节点网络:10.0.0.0/24
◼ Pod网络:10.244.0.0/16
◼ Service网络:10.96.0.0/12
IP地址 | 主机名 | 角色 |
10.0.0.100 | K8s-master01.magedu.com, K8s-master01, kubeapi.magedu.com | Master |
10.0.0.101 | K8s-master02.magedu.com, K8s-master02 | Master |
10.0.0.102 | K8s-master03.magedu.com, K8s-master03 | Master |
10.0.0.103 | K8s-node01.magedu.com, K8s-node01 | Worker |
10.0.0.104 | K8s-node02.magedu.com, K8s-node02 | Worker |
10.0.0.105 | K8s-node03.magedu.com, K8s-node03 | Worker |
准备环境
所有节点关闭swap分区
swapoff -a
vim /etc/fstab
#/swap.img none swap sw 0 0
所有节点更改hosts文件
vim /etc/hosts
10.0.0.100 K8s-master01.magedu.com K8s-master01 kubeapi.magedu.com k8sapi.magedu.com kubeapi
10.0.0.101 K8s-master02.magedu.com K8s-master02
10.0.0.102 K8s-master03.magedu.com K8s-master03
10.0.0.103 K8s-node01.magedu.com K8s-node01
10.0.0.104 K8s-node02.magedu.com K8s-node02
10.0.0.105 K8s-node03.magedu.com K8s-node03
所有节点设定时钟同步
apt -y install chrony
systemctl enable --now chrony
关闭防火墙
ubuntu:
apt install ufw 安装ufw
ufw disable 关闭防火墙
ufw status 查看状态
集群部署步骤
第一步:
安装程序包 (以下操作需要在所有节点上分别执行)
安装并启动docker
首先,生成docker-ce相关程序包的仓库,这里以阿里云的镜像服务器为例进行说明:
~# 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
接着,安装相关的程序包,Ubuntu 20.04上要使用的程序包名称为docker-ce:
~# apt install docker-ce
kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容,其中的registry-mirrors用于指明使用的镜像加速服务。
cat /etc/docker/daemon.json
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":
"max-size": "200m"
,
"storage-driver": "overlay2"
提示:自Kubernetes v1.22版本开始,未明确设置kubelet的cgroup driver时,则默认即会将其设置为systemd。
配置完成后即可启动docker服务,并将其设置为随系统启动而自动引导
~# systemctl daemon-reload
~# systemctl start docker.service
~# systemctl enable docker.service
构建仓库、安装docker、加速脚本
cat install_docker.sh
#!/bin/bash
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-EOF
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":
"max-size": "200m"
,
"storage-driver": "overlay2"
EOF
sudo systemctl restart docker
第二步:
每个节点安装cri-dockerd
Kubernetes自v1.24移除了对docker-shim的支持,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker 。
项目地址:https://github.com/Mirantis/cri-dockerd
cri-dockerd项目提供了预制的二制格式的程序包,用户按需下载相应的系统和对应平台的版本即可完成安装,这里以Ubuntu 2004 64bits系统环境,以及cri-dockerd目前最新的程序版本v0.2.5为例。
lsb_release -rc(对应下载链接的facal)
Release: 20.04
Codename: focal
下载安装
[root@K8s-master01 packages]# curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb
[root@K8s-master01 packages]#ls
cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb
[root@K8s-master01 packages]#cd
[root@K8s-master01 ~]#dpkg -i packages/cri-dockerd_0.2.6.3-0.ubuntu-focal_amd64.deb
完成安装后,相应的服务cri-dockerd.service便会自动启动。
第三步:
各节点安装kubelet、kubeadm和kubectl
把仓库指向阿里云的kubernetes仓库、各节点添加kubernetes的key、各节点安装kubelet、kubeadm和kubectl
https://developer.aliyun.com/mirror/
选择容器类--kubernetes--继续使用把下列命令在节点执行
apt-get update && apt-get install -y apt-transport-https
curl 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-get update
apt-get install -y kubelet kubeadm kubectl
第四步:
各节点整合kubelet和cri-dockerd
各节点配置cri-dockerd
配置cri-dockerd,确保其能够正确加载到CNI插件。编辑/usr/lib/systemd/system/cri-dockerd.service文件,确保其[Service]配置段中的ExecStart的值类似如下内容。
[root@K8s-master01 ~]#vim /usr/lib/systemd/system/cri-docker.service
[Service]
Type=notify
#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
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
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
网络管理将使用cni接口,cni相关插件在/opt/cni/bin目录下,缓存目录在/var/lib/cni/cache
cni各组件配置文件默认在/etc/cni/net.d
重新加载
[root@K8s-master01 ~]#systemctl daemon-reload && systemctl restart cri-docker.service
第五步:
各节点配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“。编辑文件/etc/sysconfig/kubelet,为其添加 如下指定参数。
提示:若/etc/sysconfig目录不存在,则需要先创建该目录。
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"
需要说明的是,该配置也可不进行,而是直接在后面的各kubeadm命令上使用“--cri-socket unix:///run/cri-dockerd.sock”选项。
创建目录写入内容
[root@K8s-node03 ~]#mkdir /etc/sysconfig/
[root@K8s-node03 ~]#vim /etc/sysconfig/kubelet
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"
把配置好的目录复制到其他节点
[root@K8s-node03 ~]#scp -rp /etc/sysconfig/ 10.0.0.101:/etc/
第六步:
初始化第一个主节点(root@K8s-master01)
该步骤开始尝试构建Kubernetes集群的master节点,配置完成后,各worker节点直接加入到集群中的即可。需要特别说明的是,由kubeadm部署的Kubernetes集群上,集群核心组件kube-apiserver、kube-controller-manager、kube-scheduler和etcd等均会以静态Pod的形式运行,它们所依赖的镜像文件默认来自于k8s.gcr.io这一Registry服务之上。但我们无法直接访问该服务,常用的解决办法有如下两种,本示例将选择使用更易于使用的前一种方式。
使用能够到达该服务的代理服务;
使用国内的镜像服务器上的服务,例如registry.aliyuncs.com/google_containers等。
初始化master节点(在master01上完成如下操作)
在运行初始化命令之前先运行如下命令单独获取相关的镜像文件,而后再运行后面的kubeadm init命令,以便于观察到镜像文件的下载过程。
第一个节点:查看当前镜像
[root@K8s-master01 ~]#kubeadm config images list
第一个节点:拉镜像(如果不能访问到 k8s.gcr.io,就用第二个命令从国内的镜像服务中获取各image)
一:[root@K8s-master01 ~]#kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock
二:[root@K8s-master01 ~]#kubeadm config images pull --cri-socket unix:///run/cri-dockerd.sock --image-repository=registry.aliyuncs.com/google_containers
第一个节点:运行如下命令完成k8s-master01节点的初始化并返回信息,告知接下来怎么做
[root@K8s-master01 ~]#kubeadm init --control-plane-endpoint="kubeapi.magedu.com" --kubernetes-version=v1.25.3 --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
返回提示信息如下,告知接下来怎么做
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/config
Alternatively, 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 kubeapi.magedu.com:6443 --token 6rox3l.mi1nbjyrguyjbpm3 \\
--discovery-token-ca-cert-hash sha256:ce91fc11837009a509611a3e34542df53d87477ca205d190cdab96c214f67db6 \\
--control-plane --certificate-key 66b6b2bfad2b2cd470674e728f26fb7ded655eacbfbeee85a5c44b854fa4a99e
Please 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 kubeapi.magedu.com:6443 --token 6rox3l.mi1nbjyrguyjbpm3 \\
--discovery-token-ca-cert-hash sha256:ce91fc11837009a509611a3e34542df53d87477ca205d190cdab96c214f67db6
根据以上提示执行以下命令,设定kubectl(只在master01上执行)
mkdir .kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
在所有节点执行以下命令部署网络插件
mkdir /opt/bin/
搜索https://github.com/flannel-io/flannel,下载 flanneld-amd64 放在/opt/bin/叫做flanneld
curl -L https://github.com/flannel-io/flannel/releases/download/v0.20.1/flanneld-amd64 -O /opt/bin/flanneld
设定可执行权限
[root@K8s-master01 bin]#chmod +x flanneld
或者把目录拷贝到其他的节点,就不用在其他节点执行创建下载加执行权限流程了
[root@K8s-master01 ~]#scp -rp /opt/bin/ 10.0.0.101:/opt/
在初始化的第一个master节点k8s-master01上运行如下命令,向Kubernetes部署kube-flannel(使用第二种)
第一种:(会提示无法访问github网点)
[root@K8s-master01 ~]#kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
第二种:
[root@K8s-master01 ~]#wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
[root@K8s-master01 ~]#kubectl apply -f kube-flannel.yml
使用如下命令确认其输出结果中Pod的状态为“Running”
[root@K8s-master01 ~]#kubectl get pods -n kube-flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-7p9wl 1/1 Running 0 10h
验证master节点已经就绪
[root@K8s-master01 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 11h v1.25.3
第七步:
添加节点到集群中:添加控制节点master02,master03(根据第六步master01初始化生成的提示添加)
[root@K8s-master02 ~]#kubeadm join kubeapi.magedu.com:6443 --token 6rox3l.mi1nbjyrguyjbpm3 --discovery-token-ca-cert-hash sha256:ce91fc11837009a509611a3e34542df53d87477ca205d190cdab96c214f67db6 --control-plane --certificate-key 66b6b2bfad2b2cd470674e728f26fb7ded655eacbfbeee85a5c44b854fa4a99e --cri-socket unix:///run/cri-dockerd.sock
添加完最后一行出现:Run kubectl get nodes to see this node join the cluster.
去master01查看添加的集群状态
[root@K8s-master01 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 43m v1.25.3
k8s-master02 Ready control-plane 16m v1.25.3
添加工作节点node01,node02,node03(根据第六步master01初始化生成的提示添加)
[root@K8s-node01 ~]#kubeadm join kubeapi.magedu.com:6443 --token 2gewz0.k1v4tc8p3p7n08ku --discovery-token-ca-cert-hash sha256:aa25c3805679ed0649185c7f335b8ec9dc8af3893be8f785bf618c58bc6b79d4 --cri-socket unix:///run/cri-dockerd.sock
添加完最后一行出现:Run kubectl get nodes on the control-plane to see this node join the cluster.
去master01查看添加的集群状态
[root@K8s-master01 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 55m v1.25.3
k8s-master02 Ready control-plane 29m v1.25.3
k8s-master03 Ready control-plane 10m v1.25.3
k8s-node01 Ready <none> 6m46s v1.25.3
k8s-node02 Ready <none> 4m52s v1.25.3
k8s-node03 Ready <none> 4m59s v1.25.3
此时,只有k8s-master01节点能够使用kubectl的命令,其他的master如果也能执行kubectl,执行以下操作
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
以上kubernetes集群已经搭建完成,可以在集群上运行服务:如nginx
第一步:在https://hub.docker.com/上找到nginx镜像拉取镜像
[root@K8s-master01 ~]#docker pull nginx:alpine
跑三个nginx示例(不用拉镜像,创建时会自动拉取镜像)
[root@K8s-master01 ~]#kubectl create deployment nginx --image nginx:alpine --replicas=3
deployment.apps/nginx created
查看详细信息
[root@K8s-master01 ~]#kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-55f494 1/1 Running 0 85s 10.244.3.2 k8s-node01 <none> <none>
nginx-55f494 1/1 Running 0 85s 10.244.4.2 k8s-node03 <none> <none>
nginx-55f494 1/1 Running 0 85s 10.244.5.2 k8s-node02 <none> <none>
访问各IP便会跳转到nginx欢迎页
[root@K8s-master01 ~]#curl 10.244.3.2
[root@K8s-master01 ~]#curl 10.244.4.2
[root@K8s-master01 ~]#curl 10.244.5.2
删除一个pods,会自动再生成一个pods,因为控制器要求必须有三个,不够会自动创建
[root@K8s-master01 ~]#kubectl delete pods nginx-55f494c486-j9svq
pod "nginx-55f494c486-j9svq" deleted
[root@K8s-master01 ~]#kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-55f494c486-jjvf7 1/1 Running 0 15s
nginx-55f494c486-pprjl 1/1 Running 0 14m
nginx-55f494c486-wpc2d 1/1 Running 0 14m
为pods加一个前端做负载均衡的service,访问service的网址,便会调度到后端的三台nginx上去
[root@K8s-master01 ~]#kubectl create service nodeport nginx --tcp=80:80
service/nginx created
[root@K8s-master01 ~]#kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 79m
nginx NodePort 10.99.87.93 <none> 80:31640/TCP 23s
[root@K8s-master01 ~]#curl 10.99.87.93
31640这个端口,是可以再集群外部访问到nginx
如:10.0.0.100:31640(任意节点的IP加端口即可)
Welcome to nginx!
也可进入单个pods执行命令
进入单个pods
[root@K8s-master01 ~]#kubectl exec -it nginx-55f494c486-jjvf7 -- /bin/sh
执行以下命令也可以访问到nginx的欢迎页面
/ # curl nginx
此时删除所有pod,让他们全部重建,通过service访问他们依然没有问题,因为service会基于标签选择器自动关联后端pod,无论如何动态改变,只要标签不变,都会成为固定的后端。
马哥镜像仓库:https://github.com/ikubernetes,找到learning-k8s,把仓库克隆到本地
把wordpress基于容器编排的方式部署到kubeinetes集群上,而且支持反向代理nginx到wordpress上
克隆镜像
[root@K8s-master01 ~]#git clone https://github.com/iKubernetes/learning-k8s.git
[root@K8s-master01 ~]#cd learning-k8s/wordpress/
部署数据库
[root@K8s-master01 wordpress]#kubectl apply -f mysql/
secret/mysql-user-pass created
persistentvolumeclaim/mysql-data created
service/mysql created
deployment.apps/mysql created
查看状态处于Pending状态
[root@K8s-master01 wordpress]#kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-9d74fbb9b-lk845 0/1 Pending 0 45s
nginx-55f494c486-jjvf7 1/1 Running 0 154m
nginx-55f494c486-pprjl 1/1 Running 0 168m
nginx-55f494c486-wpc2d 1/1 Running 0 168m
以上是关于Debian11最小化部署k8s集群的主要内容,如果未能解决你的问题,请参考以下文章
部署k8s集群+ceph存储出现依赖性缺失的故障案例(最小化系统arm架构)
Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)
Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)
Kubernetes部署_02_从零开始搭建k8s集群v1.21.0(亲测可用)