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、初始化配置参数
#选项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参数调整
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参数调整
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)
#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=NodePort 或 Service.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;
Comments NOTHING