实验基本信息
实验测试环境:
系统版本:centos7.9 (centos7也可以)
k8s集群版本:kubernetes 1.28.15
cri:docker 26.1.4
垫片:cri-dockerd 0.3.4
helm版本 : v3.15.4
kubeadm 重新搭建一个 k8s集群
机器情况:
192.168.0.91 jichao91
192.168.0.92 jichao92
192.168.0.93 jichao93
192.168.0.94 jichao94
四台机器 三台和往常一样,一台做初始化边缘计算
后续加入,做cri 和 docker的对应准备
metellb 这个文件可以从235机器上获取到 已准备
k8s集群 + 负载均衡metellb + 下载镜像
地址池ipaddresspool 规划为: 192.168.0.100-192.168.0.110 [默认采用第一个100]
从头开始做初始化操作
注意
需要准备的软件信息
keadm-v1.17.4-linux-amd64.tar
cri-dockerd-0.3.4-3.el7.x86_64
cri-dockerd-0.3.4.amd64
docker-26.1.4
metallb 对应的文件
边缘节点 94 也同样操作初始化操作,不加入集群
所有节点最好提前拉取好镜像,方便操作
初始化操作
增加ipv4转发
sysctl -w net.ipv4.ip_forward=1
安装docker[all nodes]
# 先配置源
vim /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
# 要设置为7 才会下载e17
yum makecache
yum -y install docker-ce
把daemon.json导入进去
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://docker.1panel.live",
"https://docker.m.daocloud.io",
"https://dockerhub.icu",
"http://hub-mirror.c.163.com"
],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/var/lib/docker"
}
EOF
cri-dockerd垫片[all nodes]
#查看包需要什么依赖 我这里是的原因是我第一个下载的包损坏了 这里注意是e17的!
rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm
# 下载rpm所需要的依赖包
yum -y install libcgroup
vim /usr/lib/systemd/system/cri-docker.service
----
修改第10行内容
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://
systemctl start cri-docker
systemctl enable cri-docker
systemctl restart docker
ps -ef | grep docker
安装k8s
配置源
# 把里面的1.31改为1.28即可
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.73281b11BEAEr6
###阿里云
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
yum clean all
yum makecache
下载指定版本
yum list kubelet --showduplicates | sort -r | grep 1.28
# 我们这里下载1.28.15
yum -y install kubectl-1.28.15-150500.1.1 kubelet-1.28.15-150500.1.1 kubeadm-1.28.15-150500.1.1
设置kubelet
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
下载所需镜像
准备k8s1.28.15 所需要的镜像
kubeadm config images list --kubernetes-version=v1.28.15
# 拉取镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 上面的命令是会去下最新的 我们要指定他的k8s版本的 指定容器运行时为docker
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.15 --cri-socket=unix://var/run/cri-dockerd.sock
集群初始化
初始化配置
kubeadm config print init-defaults > kubeadm_init.yaml
kubeadm init --config ./kubeadm_init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.0.91
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock
imagePullPolicy: IfNotPresent
name: kubeedge91
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.28.15
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}
工作节点加入[除94]
kubeadm join 192.168.0.91:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:77c2df1adf31b7ccb6628d9996db239a0f2908d9b93fec6d772aa65a8ae89c07 --cri-socket=unix://var/run/cri-dockerd.sock
kubectl get node -o wide
部署网络插件
vim calico.yaml
kubectl apply -f calico.yaml
部署基础服务
kubectl apply -f components.yaml
kubectl apply -f dashboard-user.yaml
kubectl apply -f recommended.yaml
kubectl create token admin-user -n kubernetes-dashboard
eyJhbGciOiJSUzI1NiIsImtpZCI6IjEtVkh4X3VyVzJZZkhoX2JSWlhhaDRiVndIRTltOEc4NnA1Qk9GTjQzc2cifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzM2MTcwMjA2LCJpYXQiOjE3MzYxNjY2MDYsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiMGY3YjFjZmMtYzdkZC00MDkzLWIwYTgtYjAyYzhmODY4NDEwIn19LCJuYmYiOjE3MzYxNjY2MDYsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.ZodPYfkKplsBXQ0f0qwv_o6ic6b73y7wet0PmHWkBM2EKRHkr1kLl7C8LLypI5PD5tLMy7uoAGnRbKoN9KUDf6VRRZzyYM2ToSqBPFROsk6MJVT_L0DzMjTnaIBa-Y3PG88vHfyzVBwwLLe1UrxHoY1F-v0gCGlpC3GwvuvCrUde0NIJkWGcBDQ6zF65WMo9xRWMaqj4UN-RtFZhYV2PBETYQkc1TFB36yZIRw-DEPn5Q0_d8Q5p3xuO8iL7A9tMI93Zf0Tm-qdioVhDa6DLTNjjuk_5cFAg7CUB8R7PKkIdde28aMriW3NVYkmsC6CEQ6LPSlVfATrp2u-6SMKt6Q
部署metallb
kubectl edit cm -n kube-system kube-proxy
:?mode -> ipvs
:?strictARP-> true
kubectl rollout restart daemonset kube-proxy -n kube-system
# 提前拉取镜像
wget https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
docker pull quay.io/metallb/speaker:v0.13.9
docker pull quay.io/metallb/controller:v0.13.9
kubectl apply -f metallb-native.yaml
kubectl get pod -A
kubectl apply -f IPAddressPool.yaml
kubectl apply -f L2.yaml
kubectl get ipaddresspool -n metallb-system
cloudcore 部署[master]
获取keadm工具
解压:
tar -zxvf keadm-v1.17.4-linux-amd64.tar.gz
cd keadm-v1.17.4-linux-amd64/keadm/
mv keadm /usr/local/bin/
keadm version
keadm init
默认情况下边缘节点需要访问 cloudcore 中 10000 ,10002 端口。
若要确保边缘节点可以成功地与集群通信,您需要创建防火墙规则以允许流量进入这些端口
(10000 至 10004)。
keadm init 将安装并运行 cloudcore,生成证书并安装 CRD。它还提供了一个命令行参数,
通过它可以设置特定的版本。不过需要注意的是:\ 在 v1.11.0 之前,
keadm init 将以进程方式安装并运行 cloudcore,生成证书并安装 CRD。
它还提供了一个命令行参数,通过它可以设置特定的版本。\
在 v1.11.0 之后,keadm init 集成了 Helm Chart,这意味着
cloudcore 将以容器化的方式运行。\ 如果您仍需要使用进程的方式启动 cloudcore ,
您可以使用keadm deprecated init 进行安装,或者使用 v1.10.0 之前的版本。
keadm version
下载镜像并打包
准备镜像:[所有K8S 节点]
docker pull hub.mirrorify.net/kubeedge/installation-package:v1.17.4
docker tag hub.mirrorify.net/kubeedge/installation-package:v1.17.4 kubeedge/installation-package
docker pull hub.mirrorify.net/kubeedge/iptables-manager:v1.17.4
docker tag hub.mirrorify.net/kubeedge/iptables-manager:v1.17.4 kubeedge/iptables-manager:v1.17.4
初始化cloudcore
cloudcore 初始化:
keadm init --advertise-address=192.168.0.200 --set iptablesManager.mode="external" --profile version=v1.17.4
更多参数:
keadm init --advertise-address=192.168.0.200 --set iptablesManager.mode="external" --profile version=v1.17.4 --set cloudCore.hostNetWork=false --set cloudCore.service.enable=true
设置镜像:
--set cloudCore.image.repository= --set iptablesManager.image.repository=
kubectl get ns
kubectl get po -n kubeedge
# 发现svc并没有实现负载均衡 所以要进行一下修改
kubectl get svc -n kubeedge
修改为负载均衡lb
kubectl edit svc cloudcore -n kubeedge
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 192.168.0.200
telnet 192.168.0.200 10000
设置调度
设置daemonset部署的应用仅调度到不具有node-role.kubernetes.io/edge节点上。
即阻止daemonset部署的应用调度到边缘节点.。
kubectl get daemonset -n kube-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n kube-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'
kubectl get daemonset -n metallb-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n metallb-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'
设置路由
iptables -t nat -A OUTPUT -p tcp --dport 10351 -j DNAT --to 192.168.0.200:10003
生成token[master]
keadm gettoken
082d096b0ee78f5eb234e8e8dd23c7770385cba715526bd9bea5edb31872b544.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzYzMDU5MDJ9.ZUOzKqb2CpUj57qrAyf7xKiJ1kfbF0iBbiZQtsstjRU
边缘节点配置[94]
需求为:
1、docker
2、cri-dockerd
3、keadm
1、2 都和主节点三台主机一起进行了初始化安装操作了,这块可不用做
把 master 上面的keadm拿过来使用即可
ps -ef | grep docker
scp /usr/local/bin/keadm kubeedge94:/usr/local/bin/
拉取镜像[94]
docker pull hub.mirrorify.net/kubeedge/installation-package:v1.17.4
docker tag hub.mirrorify.net/kubeedge/installation-package:v1.17.4 docker.io/kubeedge/installation-package:v1.17.4
docker pull hub.mirrorify.net/library/eclipse-mosquitto:1.6.15
docker tag hub.mirrorify.net/library/eclipse-mosquitto:1.6.15 docker.io/library/eclipse-mosquitto:1.6.15
加入节点
# 这块的token在上面已经在主节点91上生成过了
cat > keadm-edgejoin.sh << EOF
keadm join --cloudcore-ipport=192.168.0.200:10000 \
--token 082d096b0ee78f5eb234e8e8dd23c7770385cba715526bd9bea5edb31872b544.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzYzMDU5MDJ9.ZUOzKqb2CpUj57qrAyf7xKiJ1kfbF0iBbiZQtsstjRU \
--edgenode-name=kubeedge94 \
--kubeedge-version v1.17.4 \
--remote-runtime-endpoint=unix:///var/run/cri-dockerd.sock \
--cgroupdriver=systemd \
--with-mqtt
EOF
chmod +x keadm-edgejoin.sh
./keadm-edgejoin.sh
查看状态
kubectl get node -o wide
准备CNI网络插件
kubeedge94 准备CNI 插件
git clone https://github.com/kubeedge/kubeedge.git
cd kubeedge/hack/lib
source install.sh
install_cni_plugins
此处可能出现的报错
# 说已经存在了
这个时候你去/opt/cni/bin/ 下检查 确实是存在的
你将这部分二进制插件进行存放在其他文件夹下的bak中 再次执行install_cni_plugins 即可正常下载
再次检查节点状态
kubectl get node -o wide
测试
边缘节点
测试:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: hub.mirrorify.net/library/nginx:1.14.2
ports:
- containerPort: 80
nodeSelector:
"node-role.kubernetes.io/edge": ""
EOF
kubectl get po -o wide
# 在边缘节点94上进行测试
curl http://10.88.0.2
测试负载均衡
vim nginx-metallb.yaml
---
#nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-metallb
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeName: kubeedge94 # 边缘端的名字 kubectl get node里面的
hostNetwork: true # 使用主机网络 不使用主机网络,在其它主机无法进行访问
containers:
- name: nginx
image: hub.mirrorify.net/library/nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
---
kubectl get svc
[master]
curl http://192.168.0.201
http://192.168.0.91:31261
查看dashboard
https://192.168.0.91:30001