kind部署K8S集群并将“修仙业务“部署到kind集群
文章目录
- 1. 基础环境
- 2. 安装kubectl客户端
- 3. 安装kind
- 4. kind创建k8s集群
- 5. 部署修仙业务
- 6. 踩坑记录
- 6.1 loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory
- 6.2 pod拒绝连接
1. 基础环境
- 虚拟机:类红帽系统
- 内存:至少4g
- 处理器:4c
- 有docker环境
yum install -y lvm2
2. 安装kubectl客户端
- 编写yum下载源-k8s,使用阿里云源:
[kubernetes镜像_kubernetes下载地址_kubernetes安装教程-阿里巴巴开源镜像站](https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.560a1b11oZq8XJ)
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
EOFsetenforce 0yum install -y kubectl
# kubeadm kubelet
systemctl enable kubectl && systemctl start kubectl
- 设置软链接:
ln -s /usr/bin/kubectl /usr/local/bin/kubectl
3. 安装kind
- kind的github官网:
[kubernetes-sigs/kind: Kubernetes IN Docker - local clusters for testing Kubernetes](https://github.com/kubernetes-sigs/kind)
- 下载kind 1.19
[root@jumpserver ~]# chmod +x kind-linux-amd64
[root@jumpserver ~]# mv kind-linux-amd64 /usr/local/bin/
- k8s集群启动文件:kind-1c3w.yaml
mkdir -p /etc/kind
vim /etc/kind/kind-1c3w.yaml
# kind-1c3w.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:- role: control-plane # 控制平面节点extraPortMappings:- containerPort: 31000hostPort: 31000- role: worker # 工作节点 1- role: worker # 工作节点 2- role: worker # 工作节点 3
4. kind创建k8s集群
- 命令:
kind-linux-amd64 create cluster --name 1c3w-cluster --config /etc/kind/kind-1c3w.yaml
5. 部署修仙业务
-
修仙业务配置文件:
oldboyedu-network-cni-test.yaml 链接: https://pan.baidu.com/s/1nuqifEZwkD5b0NC_Gmcd7w?pwd=cypu 提取码: cypu
-
kind自带kindnet,类似于flannel,无需再次安装flannel插件;安装后会有bug,请看踩坑记录
-
查看k8s节点:
[root@jumpserver ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
1c3w-cluster-control-plane Ready control-plane 37m v1.27.1
1c3w-cluster-worker Ready <none> 37m v1.27.1
1c3w-cluster-worker2 Ready <none> 37m v1.27.1
1c3w-cluster-worker3 Ready <none> 37m v1.27.1
- 修改业务配置文件,将节点名称该为当前worker节点名称:
[root@jumpserver ~]# cat oldboyedu-network-cni-test.yaml
apiVersion: v1
kind: Pod
metadata:name: xiuxian-v1
spec:nodeName: 1c3w-cluster-worker #修改此处containers:- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 name: xiuxian---apiVersion: v1
kind: Pod
metadata:name: xiuxian-v2
spec:nodeName: 1c3w-cluster-worker2 #修改此处containers:- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v2name: xiuxian
- 运行pod:
kubectl delete -f oldboyedu-network-cni-test.yaml
kubectl apply -f oldboyedu-network-cni-test.yaml
[root@jumpserver ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
xiuxian-v1 1/1 Running 0 13m
xiuxian-v2 1/1 Running 0 13m
- 端口映射:
kubectl port-forward po/xiuxian-v1 --address=0.0.0.0 80:80
kubectl port-forward po/xiuxian-v2 --address=0.0.0.0 81:80
6. 踩坑记录
6.1 loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory
- 查看当前容器信息:
kubectl describe pod xiuxian-v1
Warning FailedCreatePodSandBox 6m24s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "7a3053da30112cf3509a53d0376a1a1ad58c604c16248833d9d162f21c3842ee": plugin type="flannel" failed (add): loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory
- 原因:
之前尝试安装过 Flannel,但安装不完整或失败了,导致集群的 CNI 配置指向了 Flannel,而 Flannel 需要的配置文件 (/run/flannel/subnet.env) 却不存在.
- 解决方案:
# 删除flannel插件
kubectl delete -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 如果url访问失败,可以从浏览器下载该yml文件,再上传至服务器
kubectl delete -f kube-flannel.yml # 删除容器内flannel文件
for i in `docker ps --filter "label=io.x-k8s.kind.cluster" --format "{{.Names}}"`; do docker exec $i rm -rf /etc/cni/net.d/*flannel* /etc/cni/net.d/10-flannel.conflist ; done# 重启容器中kubectl
for i in `docker ps --filter "label=io.x-k8s.kind.cluster" --format "{{.Names}}"`; do docker exec $i systemctl restart kubelet ; done# 删除启动的pod
kubectl delete -f oldboyedu-network-cni-test.yaml# 启动pod
kubectl apply -f oldboyedu-network-cni-test.yaml
6.2 pod拒绝连接
[root@jumpserver ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v1 1/1 Running 0 3m9s 10.244.3.3 1c3w-cluster-worker <none> <none>
[root@jumpserver ~]# curl 10.244.3.3
curl: (7) Failed to connect to 10.244.3.3 port 80: 拒绝连接
- 解决方案:
# 进入pod内部
kubectl exec -it xiuxian-v1 -- /bin/sh
# curl 127.0.0.1
# 在容器内部发现curl成功
- 需要端口映射,见上面部署业务
[root@jumpserver ~]# kubectl apply -f oldboyedu-network-cni-test.yaml
pod/xiuxian-v1 created
pod/xiuxian-v2 created
[root@jumpserver ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
xiuxian-v1 1/1 Running 0 7s
xiuxian-v2 1/1 Running 0 7s
[root@jumpserver ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
xiuxian-v1 1/1 Running 0 10s 10.244.3.6 1c3w-cluster-worker <none> <none>
xiuxian-v2 1/1 Running 0 10s 10.244.1.3 1c3w-cluster-worker2 <none> <none>
[root@jumpserver ~]# curl 10.244.3.6
curl: (7) Failed to connect to 10.244.3.6 port 80: 拒绝连接
[root@jumpserver ~]# kubectl exec -it xiuxian-v1 sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # curl 127.0.0.1
<!DOCTYPE html>
<html><head><meta charset="utf-8"/><title>yinzhengjie apps v1</title><style>div img {width: 900px;height: 600px;margin: 0;}</style></head><body><h1 style="color: green">凡人修仙传 v1 </h1><div><img src="1.jpg"><div></body></html>