Kubernetes安装(Sealos)

1. 在联网服务器拉取镜像并打包

  1. 访问Sealos源码下载二进制包,复制到联网服务器。
  2. 使用tar xvf sealos_5.1.1_linux_amd64.tar.gz sealos解压,使用mv sealos /usr/local/bin/放到全局工具目录,使用sealos version验证生效。
  3. 访问Registry Explore网站确定registry.cn-shanghai.aliyuncs.com/labring/kubernetesregistry.cn-shanghai.aliyuncs.com/labring/helmregistry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controllerregistry.cn-shanghai.aliyuncs.com/labring/cilium的版本。
  4. 使用如下命令拉取远程镜像到本地(使用sealos images查看本地镜像):
    1
    2
    3
    sealos pull registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.31.11
    sealos pull registry.cn-shanghai.aliyuncs.com/labring/helm:3.19.2
    sealos pull registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.14.19
    
  5. 使用如下命令将本地镜像打包(仅归档不压缩):
    1
    2
    3
    sealos save -o kubernetes-v1.31.11.tar registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.31.11
    sealos save -o helm-v1.19.2.tar registry.cn-shanghai.aliyuncs.com/labring/helm:v3.19.2
    sealos save -o cilium-v1.14.19.tar registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.14.19
    
  6. 将镜像包复制到离线服务器(master节点),所有离线服务器使用相同密码。

2. 在离线服务器装载镜像并安装

  1. 在离线服务器(master节点)部署Sealos
  2. 使用如下命令将镜像包装载为本地镜像(使用sealos images查看本地镜像):
    1
    2
    3
    sealos load -i kubernetes-v1.31.11.tar
    sealos load -i helm-v1.19.2.tar
    sealos load -i cilium-v1.14.19.tar
    
  3. 使用sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.31.11 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.19.2 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.14.19 --masters 10.10.10.20 --nodes 10.10.10.21,10.10.10.22 -p L+ah204313805安装Kubernetes
  4. 安装完成后使用kubectl get node -o wide查看节点状态,使用kubectl get pod -A -o wide查看容器组状态(如果coredns没启动,有可能是/etc/resolv.conf为空导致coredns获取不到上游DNS信息)。
  5. 使用cat .kube/config获取集群信息(如果server后边的信息不对需要先修改),在图形化界面导入即可管理集群。

3. 安装IngressNginxController

  1. 访问ingress-nginx-4.14.3.tgz源码下载二进制包,复制到离线服务器。
  2. docker.1ms.run/dyrnq/kube-webhook-certgen:v1.6.7docker.1ms.run/dyrnq/ingress-nginx-controller:v1.14.3推送到Harbor仓库。
  3. 使用tar -zxvf ingress-nginx-4.14.3.tgz解压,使用vi ingress-nginx/values.yamlregistry:后边换成10.10.10.12
  4. 使用helm install ingress-nginx ingress-nginx --namespace ingress-nginx --create-namespace安装ingress-nginx-controller

4. 解决证书过期问题

使用kubeadm certs check-expiration命令查看证书过期时间,会发现super-admin.conf的有限期只有一年,到期后可以使用如下脚本自动续期:
vi /usr/local/bin/renew-k8s-certs.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
LOG_FILE="/var/log/k8s-cert-renew.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] 开始检查并续期证书..." >> $LOG_FILE
kubeadm certs renew all >> $LOG_FILE 2>&1

for component in kube-apiserver kube-controller-manager kube-scheduler etcd; do
  if [ -f "/etc/kubernetes/manifests/$component.yaml" ]; then
    mv /etc/kubernetes/manifests/$component.yaml /tmp/
    sleep 20
    mv /tmp/$component.yaml /etc/kubernetes/manifests/
  fi
done

systemctl restart kubelet
cp /etc/kubernetes/admin.conf /root/.kube/config
echo "[$DATE] 证书续期完成" >> $LOG_FILE

chmod +x /usr/local/bin/renew-k8s-certs.sh
crontab -e

1
0 3 1 */2 * /usr/local/bin/renew-k8s-certs.sh

5. Kubernetes基础操作

  1. 创建命名空间loonzhkubectl create namespace loonzh
  2. 启动Pod(离线服务器需要提前加载镜像包):kubectl run nginx -n loonzh --image=docker.1ms.run/nginx:1.29.6
  3. 查看Pod信息(IP字段是容器的集群地址,可以用来访问Nginx欢迎页):kubectl describe pod nginx -n lonnzh
  4. 启动Deployment(Deployment会守护Pod):kubectl create deployment nginx -n loonzh --image=docker.1ms.run/nginx:1.29.6

vim nginx.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: loonzh
  name: nginx-deployment
  labels:
    app: nginx-deployment-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: docker.1ms.run/nginx:1.29.6
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: loonzh
  name: nginx-service
  labels:
    app: nginx-service-app
spec:
  selector:
    app: nginx
  ports:
  - port: 10080
    targetPort: 80
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: loonzh
spec:
  ingressClassName: ingress
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 10080