kubernetes安装记录

烂柯 发布于 2023-06-08 172 次阅读


Kubernetes安装记录

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。本文主要记录通过Kubeadm引导安装集群。

准备开始

  • 每台机器CPU 2 核心及以上、2+ GB RAM(如果少于这个数字将会影响你应用的运行内存)。
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid,详细信息
  • 开启机器上的某些端口 如6443,详细信息
  • 禁用交换分区。例如,sudo swapoff -a 将暂时禁用交换分区。

kubernetes version :v1.27.2

Linux:centos 7.9

master:192.168.1.7

worker:192.168.1.10

一、容器运行时

你需要在集群内每个节点上安装并配置 容器运行时 以使 Pod 可以运行在上面

1、先决条件

服务器配置条件

#1)、设置IPv4、iptables
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter
#验证 br_netfilter 和 overlay 模块加载:
lsmod | grep br_netfilter
lsmod | grep overlay

#2)、设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

#验证sysctl参数
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

#3)、重启容器运行时
# 如: systemctl daemon-reload && systemctl restart docker
#systemctl daemon-reload && systemctl restart containerd

#4)、 关闭 防火墙
#systemctl disable firewalld --now
systemctl stop firewalld
systemctl disable firewalld

#5)、 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

#6)、 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

2、选择运行时

选项1:containerd容器

a、安装containerd,文档
#必须安装runc和CNI插件。
#下载
wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz
#解压至 /usr/local
tar Cxzvf /usr/local containerd-1.7.2-linux-amd64.tar.gz

#添加系统服务
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
mkdir -p /usr/local/lib/systemd/system
cp  containerd.service /usr/local/lib/systemd/system
#设置服务
systemctl daemon-reload
systemctl enable --now containerd
b、安装 runc

runc是一个 CLI 工具,用于根据 OCI 规范在 Linux 上生成和运行容器

wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc
c、安装CNI插件(可选)

注意:安装kubeadm时会自动附带安装

wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.3.0.tgz
d、安装CLI(可选)

nerdctl 与kubeadm CLI (crictl,k8s社区的专用CLI)不一致镜像查询有差异。ctr是containerd自带的工具,有命名空间的概念。若是k8s相关的镜像,默认在命名空间 k8s.io。crictl images <=> ctr -n k8s.io i list <=> nerdctl -n k8s.io images

wget https://github.com/containerd/nerdctl/releases/download/v1.4.0/nerdctl-1.4.0-linux-amd64.tar.gz
tar Cxzvvf /usr/local/bin nerdctl-1.4.0-linux-amd64.tar.gz

注:后续安装内容基于containerd容器运行时

基于containerd容器运行时需将unix:///var/run/cri-dockerd.sock替换为unix:///var/run/containerd/containerd.sock

选项2:docker 容器

a、安装docker,文档
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#设置开机启动并运行
systemctl enable docker --now
b、配置驱动
vim /usr/lib/systemd/system/docker.service
#启动参数 --exec-opt native.cgroupdriver=systemd
...
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
...
c、安装cri-dockerd

​ Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。 为此,必须安装一个额外的服务 cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除

下载地址

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2-3.el7.x86_64.rpm
yum install -y cri-dockerd-0.3.2-3.el7.x86_64.rpm
#设置开机启动并运行
systemctl enable cri-docker --now 

3、配置容器运行时

containerd v1.5之前推荐配置镜像仓方式(需要重启服务)containerd v1.5之后推荐配置镜像仓方式(不用重启服务)

a、配置文件

#创建或覆盖配置
mkdir /etc/containerd
cp /etc/containerd/config.toml /etc/containerd/config.toml.backup
containerd config default > /etc/containerd/config.toml

b、修改配置文件

vi 查找 /systemdcgroup\c

vi /etc/containerd/config.toml
...
[grpc]
  #与容器运行时对应参考二、4内容,一般不做修改
  address = "/run/containerd/containerd.sock"
...
#调整国内镜像源(需与后续master镜像地址保持一致),并且这里的版本号需要与后续初始化所拉取的镜像版本号对应
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
...
#配置systemd cgroup 驱动
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
...
#配置docker.io镜像加速(加速地址可能失效,请替换登录阿里云、华为云或腾讯云获取镜像加速地址)
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://registry.docker-cn.com","https://registry.aliyuncs.com"]
...
#重启containerd
systemctl restart containerd

二、安装Kubeadm

安装 kubeadm、kubelet 和 kubectl 对应官方文档,需要在每台机器上安装。

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

1、设置kubernetes源并安装

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 关闭 SeLinux
# setenforce 0
#安装 kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl
#设置kubelet开机启动
systemctl enable kubelet

2、kubectl命令自动补全

yum install bash-completion -y
vi ~/.bashrc
#~/.bashrc添加source
source /usr/share/bash-completion/bash_completion

#启动 kubectl 自动补全功能
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
sudo chmod a+r /etc/bash_completion.d/kubectl
#重新加载 Shell 
source ~/.bashrc

3、设置crictl,文档

vi /etc/crictl.yaml
runtime-endpoint: "unix:///var/run/containerd/containerd.sock"
image-endpoint: "unix:///var/run/containerd/containerd.sock"

#查看镜像
crictl images

containerd unix:///var/run/containerd/containerd.sock
CRI-O unix:///var/run/crio/crio.sock
Docker Engine(使用 cri-dockerd) unix:///var/run/cri-dockerd.sock

注:需要根据所选容器运行时进行配置,master初始时也需要在文件中进行调整容器运行时接口,比如基于containerd容器需将unix:///var/run/cri-dockerd.sock替换为unix:///var/run/containerd/containerd.sock

如果已安装docker注意查看 systemctl status docker 启动是否有参数--containerd

#本文所遇为镜像缺失(registry.k8s.io/pause:3.8 或registry.k8s.io/pause:3.6)手动拉取并设置tag。
crictl pull registry.aliyuncs.com/google_containers/pause:3.8
# crictl暂时不支持tag,使用ctr或nerdctl打tag
ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8
# nerdctl -n k8s.io tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8

# docker pull registry.aliyuncs.com/google_containers/pause:3.8
# docker tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8

以上步骤是基础环境搭建步骤每台设备均需要执行,以下步骤分设备仅执行一次(除堆叠式etcd高可用)

三、Master初始化

1、堆叠式etcd高可用(可选)

高可用拓扑选项,至少需要三台控制平面节点,采用软件负载将keepalived和haproxy作为静态 Pod 运行,设置请参考此文档

注:每台控制面板节点均需要设置软件负载即以下a-d步骤

基本只有keepalived配置存在主备差异,haproxy配置及校验脚本可以放入nfs挂载共享

a)、添加keepalived配置

mkdir /etc/keepalived
vi /etc/keepalived/keepalived.conf
#keepalived.conf内容如下
global_defs {
    router_id LVS_DEVEL
}
vrrp_script check_apiserver {
  script "/etc/keepalived/check_apiserver.sh"
  interval 3
  weight -2
  fall 10
  rise 2
}

vrrp_instance VI_1 {
    #主设备设置为MASTER,备份设备设置为BACKUP
    state MASTER
    #网卡
    interface eth0
    #路由器唯一标识,同路由器相同
    virtual_router_id 51
    #优先级,范围:1-254,主设备设置为101,备份设备设置为100,主设备比备份设备高即可
    priority 101
    authentication {
        auth_type PASS
        #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必须一样
        auth_pass 42
    }
    virtual_ipaddress {
        #虚拟ip ${APISERVER_VIP} (注:需要同网段)
        192.168.1.200
    }
    track_script {
        check_apiserver
    }
}

b)、添加check脚本

vi /etc/keepalived/check_apiserver.sh
#check_apiserver.sh内容如下
#!/bin/sh
errorExit() {
    echo "*** $*" 1>&2
    exit 1
}
curl --silent --max-time 2 --insecure https://localhost:5443/ -o /dev/null || errorExit "Error GET https://localhost:5443/"
#if ip addr | grep -q ${APISERVER_VIP}; then
if ip addr | grep -q 192.168.1.200; then
    #虚拟ip:haproxy代理端口  ${APISERVER_VIP}:${APISERVER_DEST_PORT}
    curl --silent --max-time 2 --insecure https://192.168.1.200:5443/ -o /dev/null || errorExit "Error GET https://192.168.1.200:5443/"
fi

c)、添加haproxy配置

mkdir /etc/haproxy
vi /etc/haproxy/haproxy.cfg
#haproxy.cfg内容如下
global
    log /dev/log local0
    log /dev/log local1 notice
    daemon
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 1
    timeout http-request    10s
    timeout queue           20s
    timeout connect         5s
    timeout client          20s
    timeout server          20s
    timeout http-keep-alive 10s
    timeout check           10s
frontend apiserver
    ##${APISERVER_DEST_PORT},设置bind端口
    bind *:5443
    mode tcp
    option tcplog
    default_backend apiserver

backend apiserver
    option httpchk GET /healthz
    http-check expect status 200
    mode tcp
    option ssl-hello-chk
    balance     roundrobin
        #目标服务器列表及端口,当前服务启动后再开发
        #server ${HOST1_ID} ${HOST1_ADDRESS}:${APISERVER_SRC_PORT} check
        server master1 192.168.1.7:6443 check
        server master2 192.168.1.8:6443 check
        server master3 192.168.1.9:6443 check

d)、静态 Pod运行keepalived和haproxy

kubernetes静态pod文档地址,因为kubelet staticPodPath默认配置为 /etc/kubernetes/manifests,所以只需要将keepalived.yaml和haproxy.yaml在/etc/kubernetes/manifests下就可以了

mkdir /etc/kubernetes/manifests
vi /etc/kubernetes/manifests/keepalived.yaml
#keepalived.yaml内容如下
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: keepalived
  namespace: kube-system
spec:
  containers:
  - image: osixia/keepalived:2.0.17
    name: keepalived
    resources: {}
    securityContext:
      capabilities:
        add:
        - NET_ADMIN
        - NET_BROADCAST
        - NET_RAW
    volumeMounts:
    - mountPath: /usr/local/etc/keepalived/keepalived.conf
      name: config
    - mountPath: /etc/keepalived/check_apiserver.sh
      name: check
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/keepalived/keepalived.conf
    name: config
  - hostPath:
      path: /etc/keepalived/check_apiserver.sh
    name: check
status: {}
vi /etc/kubernetes/manifests/haproxy.yaml
#haproxy可能会提示server目标服务器无法联通,多重启几次haproxy pod
#haproxy.yaml内容如下
apiVersion: v1
kind: Pod
metadata:
  name: haproxy
  namespace: kube-system
spec:
  containers:
  - image: haproxy:2.1.4
    name: haproxy
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: localhost
        path: /healthz
        #${APISERVER_DEST_PORT}
        port: 5443
        scheme: HTTPS
    volumeMounts:
    - mountPath: /usr/local/etc/haproxy/haproxy.cfg
      name: haproxyconf
      readOnly: true
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/haproxy/haproxy.cfg
      type: FileOrCreate
    name: haproxyconf
status: {}

2、初始化配置参数

kubelet config文档

kubeadm config 文档

#选项1、生成初始化配置
kubeadm config print init-defaults > /root/k8s.init.config.yaml

#查看所有默认配置
#kubeadm config print init-defaults --component-configs KubeletConfiguration
vi /root/k8s.init.config.yaml
#k8s.init.config.yaml 注意修改设置 networking  podSubnet,会影响后续网络插件安装
apiVersion: kubeadm.k8s.io/v1beta3
...
localAPIEndpoint:
  #单master ip地址
  #advertiseAddress: 192.168.1.7
  bindPort: 6443
nodeRegistration:
  #需要修改对应的容器运行时
  criSocket: unix:///var/run/cri-dockerd.sock
...
#修改镜像仓(可选,如果修改了必须预加载镜像)
imageRepository: registry.aliyuncs.com/google_containers
...
#<自定义域名>,设置高可用控制面板地址,单master不需要设置
controlPlaneEndpoint: "api.service.k8s:5443"
networking:
  dnsDomain: cluster.local
  #修改serveice网段
  serviceSubnet: 10.98.0.0/16
  #添加pod网段
  podSubnet: 10.100.0.0/16
...
#添加所有节点kubelet配置(以下配置可选)
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
#kubelet向主控节点汇报节点状态的时间间隔,默认值 10s,该配置需协同kube-controller-manager参数node-monitor-grace-period实现
nodeStatusReportFrequency: 5s

3、预加载镜像(可选)

#查看所需镜像
kubeadm --config /root/k8s.init.config.yaml config images list
#kubeadm --image-repository registry.aliyuncs.com/google_containers config images list

#加载镜像
kubeadm --config /root/k8s.init.config.yaml config images pull
#kubeadm --image-repository registry.aliyuncs.com/google_containers config images pull

4、master初始化

#添加host,APISERVER_VIP如果是非高可以APISERVER_VIP值为127.0.0.1
#echo "${APISERVER_VIP} <自定义域名>" >> /etc/hosts
echo "192.168.1.200 api.service.k8s" >> /etc/hosts
echo "127.0.0.1 $(hostname)"  >> /etc/hosts
#执行初始化命令
#初始化参数,最好指定节点名称--node-name,并且将节点名称写入hosts(不写入可能会初始化失败)
kubeadm init --config /root/k8s.init.config.yaml --node-name  $(hostname) --upload-certs

#成功后执行以下命令(初始化成功后打印的命令,以便cri能够正常运行)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#查看节点(没有安装网络插件状态都是NotReady)
kubectl get nodes

#重置节点,如果初始化失败需要以下命令重置节点
#kubeadm reset
# kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock

5、单机模式(可选)

部署kubernetes只有一个节点,用于测试或开发

#1、添加角色
#表示master:node-role.kubernetes.io/control-plane=
#表示worker:node-role.kubernetes.io/worker=
#设置角色, 如果想删除,把=换成-
kubectl label nodes <nodeName> node-role.kubernetes.io/worker=
#2、移除污点
kubectl taint node <nodeName> node.kubernetes.io/not-ready-
kubectl taint node <nodeName> node-role.kubernetes.io/control-plane-

6、参数调整(可选)

a)、kube-apiserver参数调整

kube-apiserver参数配置文档

vi /etc/kubernetes/manifests/kube-apiserver.yaml
#修改保存后kube-apiserver pod会自动重启,手动重启命令如下
export APISERVER_PODS=$(kubectl get pods --selector=component=kube-apiserver -n kube-system --output=jsonpath={.items..metadata.name})
kubectl delete pod $APISERVER_PODS -n kube-system
...
spec:
  containers:
  - command:
    - kube-apiserver
    #添加或修改nodeport可见性服务端口范围,默认30000-32767
    - --service-node-port-range=30000-32767
    #已经添加的deployment需要重新添加才会生效
    #添加或修改污点容忍时长(秒),使pod能够快速重启恢复,默认值300
    - --default-not-ready-toleration-seconds=30
    - --default-unreachable-toleration-seconds=30
...

b)、kube-controller-manager参数调整

kube-controller-manager参数配置文档

vi /etc/kubernetes/manifests/kube-controller-manager.yaml
#修改保存后kube-controller-manager pod会自动重启,手动重启命令如下
export MANAGER_PODS=$(kubectl get pods --selector=component=kube-controller-manager -n kube-system --output=jsonpath={.items..metadata.name})
kubectl delete pod $MANAGER_PODS -n kube-system
...
spec:
  containers:
  - command:
    - kube-controller-manager
    # Node 标记为不健康之前允许其无响应的时长上限(秒),默认值40s,必须比节点参数--node-status-update-frequency(默认10s)大N倍
    # 频率过高可能导致node状态切换进而影响pod
    - --node-monitor-grace-period=20s
...

c)、kubelet参数调整

kubelet参数配置文档,kubelet可通过master初始化配置文件进行统一配置(node-status-update-frequency)

#查看所有默认配置与apiVersion: kubelet.config.k8s.io/v1beta1部分进行对应配置
kubeadm config print init-defaults --component-configs KubeletConfiguration

7、其他master节点加入集群(高可用)

# 其他master加入集群
scp -r /etc/{haproxy,keepalived}  root@192.168.1.9:/etc/
scp /etc/kubernetes/manifests/{haproxy.yaml,keepalived.yaml}  root@192.168.1.9:/etc/kubernetes/manifests
#echo "${APISERVER_VIP} <自定义域名>" >> /etc/hosts
echo "192.168.1.200 api.service.k8s" >> /etc/hosts
echo "127.0.0.1 $(hostname)"  >> /etc/hosts
#rscp -r /etc/kubernetes/pki/  root@<master2 ip>:/etc/kubernetes/pki/
# Master执行获取接入命令
echo "$(kubeadm token create --print-join-command)  --control-plane  --certificate-key $(kubeadm init phase upload-certs --upload-certs --config /root/k8s.init.config.yaml|awk 'NR==3 {print}')"

#执行以下<初始化打印>的命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#master退出集群
#a、设置不可调度
kubectl cordon worker1
#b、驱逐pod
kubectl drain worker1
#c、删除节点
kubectl delete node <节点名称>
#d、清理etcd
kubectl exec -ti etcd-master1 -n kube-system sh
#查询etcd list
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key member list
#移除指定etcd
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key member remove <id>
#e、重启节点
kubeadm reset

四、Worker节点加入集群

# worker加入集群
#echo "${APISERVER_VIP} <自定义域名>" >> /etc/hosts
echo "192.168.1.200 api.service.k8s" >> /etc/hosts
# Master执行获取接入命令获取节点加入命令
kubeadm token create --print-join-command

#worker退出集群
#a、设置不可调度
kubectl cordon worker1
#b、驱逐pod
kubectl drain worker1
#c、删除节点
kubectl delete node <节点名称>
#d、重置节点
kubeadm reset

五、安装网络插件(calico)

calico官网安装文档

#1、创建 Calico 所需资源
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/tigera-operator.yaml
#2、根据资源安装Calico
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/custom-resources.yaml
#设置网段与 pod-network-cidr 一致
sed -i "s#192.168.0.0/16#10.100.0.0/16#" custom-resources.yaml
kubectl apply -f custom-resources.yaml

#3、使用以下命令确认所有 pod 都在运行。
watch kubectl get pods -n calico-system

六、Ingress控制器(可选)

Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。

​ Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePortService.Type=LoadBalancer 类型的 Service。

​ 你可能需要部署 Ingress 控制器,例如 ingress-nginx。 你可以从许多 Ingress 控制器 中进行选择。

#安装Ingress-nginx
#默认无负载均衡且不会暴露宿主机80、443端口
# https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#over-a-nodeport-service
wget -o nginx-ingress-controller.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml

sed -i "s#registry.k8s.io/ingress-nginx/controller#registry.aliyuncs.com/google_containers/nginx-ingress-controller#" nginx-ingress-controller.yaml
sed -i "s#registry.k8s.io/ingress-nginx#registry.aliyuncs.com/google_containers#" nginx-ingress-controller.yaml
kubectl apply -f nginx-ingress-controller.yaml

七、NFS 存储类(可选)

nfs-subdir-external-provisioner项目地址

注:此方式必须所有节点均安装nfs-utils,因为需要宿主机支持mount.nfs(/sbin/mount.)

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set nfs.server=192.168.1.6 \
    --set nfs.path=/share-k8s/storage-class \
    --set storageClass.name=storage-class-nfs \
    --set storageClass.defaultClass=true \
    --set image.repository=eipwork/nfs-subdir-external-provisioner \
    -n kube-system
#查看
kubectl get sc

八、Dashboard(可选)

选项1:kuboard

Kuboard支持kubernetes多集群管理,由于版本差异无法直接运行,需要调整yaml对应#328

curl -O https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
vi kuboard-v3.yaml
#KUBOARD_SERVER_NODE_PORT: '30080'替换如下
#KUBOARD_ENDPOINT: 'http://your-node-ip-address:30080'

kubectl create -f kuboard-v3.yaml

访问: http://your-node-ip-address:30080

默认账号密码:admin Kuboard123

选项2:kubernetes dashboard

Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。

a、安装

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

b、创建用户

#创建用户文件
vi dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
#添加用户
kubectl apply -f dashboard-admin.yaml

c、访问

#启用 Dashboard 访问
#方式一(推荐)
kubectl port-forward --namespace kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0

#方式二 (会检测不安全访问,可以用nginx代理)
kubectl proxy --address='0.0.0.0' --accept-hosts='^.*$' &

#访问dashboard
http://<ip>:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 
#获取token
kubectl -n kubernetes-dashboard create token admin-user

九、异常处理

1、初始化失败(Initial timeout of 40s passed)

注:执行初始化命令后观察kubelet服务错误信息 journalctl -exu kubelet -f

如果无任何容器运行,查看日志分析 (单master忽略6443连接错误)

#本文所遇为镜像缺失(registry.k8s.io/pause:3.8 或registry.k8s.io/pause:3.6)手动拉取并设置tag。
docker pull registry.aliyuncs.com/google_containers/pause:3.8
docker tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8

# crictl pull registry.aliyuncs.com/google_containers/pause:3.8
# crictl暂时不支持tag,使用ctr或nerdctl打tag
# nerdctl -n k8s.io tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8
# ctr -n k8s.io images tag registry.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8

2、pod一直处于异常状态

#查看pod信息
 kubectl describe pod kube-proxy-5jjmn -n kube-system

3、查看、删除污点

#查看节点信息
kubectl describe nodes <节点名称>
#Taints 展示的是污点
#Allocated resources: 为节点所占资源总和

#删除污点
kubectl taint nodes <节点名称> node-role.kubernetes.io/master-
#kubectl taint nodes <节点名称> <污点名称>-

4、worker使用kubectl

#查看配置
kubectl config view
#拷贝master配置至worker
scp /etc/kubernetes/admin.conf root@192.168.1.6:/etc/kubernetes/

5、csi-node-driver、calico-node只有一个成功运行

可能是网卡绑定错误,这时就需要使用万能的重启功能

6、删除pod自动启动,无法彻底删除

先删除pod的话,马上会创建一个新的pod,deployment中定义了副本数量

先删除deployment,再删除pod,如果还是无法删除pod,需要检查rc/rs并删除对应rc/rs后再删除pod

7、crictl取镜像失败,ctr可以拉取

可以看看kubelet服务日志输出,很多情况都可以根据该日志进行处理

8、error execution phase check-etcd

master退出集群没有清理对应的etcd,导致etcd无法启动

#清理etcd
#进入etcd容器
kubectl exec -ti etcd-master1 -n kube-system sh
#查询etcd list
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key member list
#移除指定etcd
etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key member remove <id>
#退出etcd容器
exit;
烂柯

最后更新于 2024-01-17