编辑
2025-10-23
kubernetes
00

目录

部署Kubernetes-v1.32集群
关闭防火墙及相关配置
修改主机名
主机名DNS解析
时间同步
配置网络
重启服务器
完成系统配置,继续在这 3 台主机上安装以下软件
安装 Docker
安装 cri-dockerd
添加YUM源
安装 kubeadm、kubelet 和 kubectl
Master 节点初始化 K8s
Worker 节点加入 K8s 集群
安装 K8s 网络插件
calico拉取失败
手动拉取
查看pod状态
查看node状态
集群重置
部署Metrics-Server
下载 metrics-server 官方 yaml:
修改 metrics-server 启动参数
部署 metrics-server
检查运行状态
部署 k8s dashboard
拓展
宿主机重启,集群异常
kubectl自动补全
查看和查找资源
删除重启次数非0的pod

部署Kubernetes-v1.32集群

实例名主机名内网地址主机配置备注
s1k8s-master10.0.0.22核,4GiB,系统盘 20GiB控制节点
s2k8s-worker-110.0.0.32核,4GiB,系统盘 25GiB工作节点
s3k8s-worker-210.0.0.42核,4GiB,系统盘 25GiB工作节点
关闭防火墙及相关配置
bash
# 关闭和禁用防火墙 systemctl stop firewalld && systemctl disable firewalld # 关闭selinux,selinux 是 Linux 系统下的一个安全服务,需要关闭 setenforce 0 # 临时 sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 # 关闭 Linux 的 swap 分区,提升 k8s 的性能 swapoff -a # 临时 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
修改主机名
bash
# 在 s1 这个机器上执行修改主机名命令 hostnamectl set-hostname k8s-master # 在s2 这个机器上执行修改主机名命令 hostnamectl set-hostname k8s-worker-1 # 在s3这个机器上执行修改主机名命令 hostnamectl set-hostname k8s-worker-2
主机名DNS解析

在3个服务器上都增加主机名和 IP 的对应关系,执行以下命令快速编辑 /etc/hosts 文件,增加解析配置。

bash
# 添加各个节点的解析,IP 地址需要替换为你自己服务器的内网 IP 地址。 cat >> /etc/hosts << EOF 10.0.0.2 k8s-master 10.0.0.3 k8s-worker1 10.0.0.4 k8s-worker2 EOF
时间同步

K8s 要求集群中的所有服务器时间一致,使用 ntpdate(Network Time Protocol)从网络同步时间,执行以下命令安装 ntpdate,之后再执行同步命令。

bash
# 安装chrony服务 yum install chrony -y # 设置时区 timedatectl set-timezone "Asia/Shanghai" && chronyc -a makestep # 查看服务状态 systemctl status chronyd.service # 显示chronyd服务正在使用的NTP源服务器的详细状态 chronyc sources –v # 查看当前时间/日期/时区 timedatectl status #手动调整 date -s "now + 20 minutes" #同步硬件 hwclock -w # 重启chronyd服务 systemctl restart chronyd.service && systemctl enable chronyd.service --now
配置网络

为了让 K8s 能够转发网络流量,需要修改 iptables 的配置。执行以下命令快速编辑 etc/sysctl.d/k8s.conf 配置文件,增加 iptables 的配置。

bash
# 修改 Linux 内核参数,添加网桥过滤和地址转发功能 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 使配置生效 sysctl --system
重启服务器
bash
reboot
完成系统配置,继续在这 3 台主机上安装以下软件
安装 Docker

使用 Docker 作为运行容器的运行时组件,需要先安装 Docker。通过 wget 命令来下载 Docker 的安装包仓库,然后通过 yum 命令进行安装,安装完成之后再执行开启 Docker 服务命令。

bash
# 通过 wget 命令获取 docker 软件仓库信息 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # 安装 docker-ce yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 开启 docker 服务 systemctl enable docker && systemctl start docker # 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。 # vim /etc/yum.repos.d/docker-ce.repo # 将[docker-ce-test]下方的enabled=0修改为enabled=1 # # 安装指定版本的Docker-CE: # Step 1: 查找Docker-CE的版本: # yum list docker-ce.x86_64 --showduplicates | sort -r # Loading mirror speeds from cached hostfile # Loaded plugins: branch, fastestmirror, langpacks # docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable # docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable # docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable # Available Packages # Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos) # sudo yum -y install docker-ce-[VERSION]

Docker 安装完成之后,配置阿里云提供的镜像库来加速镜像下载。

bash
# 配置镜像下载加速器,国内使用阿里云镜像库会更快 cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://docker.1panel.live", "https://hub.rat.dev" ] } EOF # 重启 docker 服务 systemctl restart docker
安装 cri-dockerd

cri-dockerd 用于为 Docker 提供一个能够支持 K8s 容器运行时标准的工具,从而能够让 Docker 作为 K8s 容器引擎。通过 wget 下载 cri-dockerd 安装包,然后通过 rpm 命令进行安装。

bash
# 通过 wget 命令获取 cri-dockerd软件 wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.13/cri-dockerd-0.3.13-3.el8.x86_64.rpm # 通过 rpm 命令执行安装包 yum localinstall cri-dockerd-0.3.13-3.el8.x86_64.rpm -y

安装完成后修改配置文件(/usr/lib/systemd/system/cri-docker.service),在 ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// 这一行增加 –pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

bash
# 打开 cri-docker.service 配置文件 vim /usr/lib/systemd/system/cri-docker.service # 修改对应的配置项 ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

配置文件修改后,重新加载配置并开启 cri-dockerd 服务。

bash
# 加载配置并开启服务 systemctl daemon-reload systemctl enable cri-docker && systemctl start cri-docker
添加YUM源
bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF
安装 kubeadm、kubelet 和 kubectl

所有K8S服务器上都需要安装 kubeadm、kubelet 和 kubectl 这三个工具。

  • kubeadm 用来初始化 K8s 集群;
  • kubelet 是每个节点的 K8s 管理员;
  • kubectl 是 K8s 的命令行交互工具。

安装 kubelet、kubeadm 和 kubectl,并启用 kubelet 以确保它在启动时自动启动:

bash
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes # 开机启动 kubelet 服务 systemctl enable --now kubelet
Master 节点初始化 K8s

所有准备工作都完成,可以进行 K8s 的初始化了,只需要在 Master 节点上执行以下初始化命令。

bash
kubeadm init \ --apiserver-advertise-address=10.0.0.2 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.32.6 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 \ --cri-socket=unix:///var/run/cri-dockerd.sock \ --ignore-preflight-errors=all

注意:“apiserver-advertise-address” 参数需要替换成 Master 节点服务器的内网 IP。

相关参加解释:

  • apiserver-advertise-address:集群广播地址,用 master 节点的内网 IP。

  • image-repository:由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。

  • kubernetes-version: K8s 版本,与上面安装的软件版本一致。

  • service-cidr:集群 Service 网段。

  • pod-network-cidr:集群 Pod 网段。

  • cri-socket:指定 cri-socket 接口,我们这里使用 unix:///var/run/cri-dockerd.sock。

    执行命令后耐心等待,直到安装完成,会出现以下内容

bash
[root@k8s-master ~]# kubeadm init \ > --apiserver-advertise-address=10.0.0.2 \ > --image-repository registry.aliyuncs.com/google_containers \ > --kubernetes-version v1.32.6 \ > --service-cidr=10.96.0.0/12 \ > --pod-network-cidr=10.244.0.0/16 \ > --cri-socket=unix:///var/run/cri-dockerd.sock \ > --ignore-preflight-errors=all [init] Using Kubernetes version: v1.32.6 [preflight] Running pre-flight checks [WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly [WARNING FileExisting-socat]: socat not found in system path [WARNING FileExisting-tc]: tc not found in system path [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' [certs] Using certificateDir folder "/etc/kubernetes/pki" [certs] Generating "ca" certificate and key [certs] Generating "apiserver" certificate and key [certs] apiserver serving cert is signed for DNS names [k8s-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.0.0.2] [certs] Generating "apiserver-kubelet-client" certificate and key [certs] Generating "front-proxy-ca" certificate and key [certs] Generating "front-proxy-client" certificate and key [certs] Generating "etcd/ca" certificate and key [certs] Generating "etcd/server" certificate and key [certs] etcd/server serving cert is signed for DNS names [k8s-master localhost] and IPs [10.0.0.2 127.0.0.1 ::1] [certs] Generating "etcd/peer" certificate and key [certs] etcd/peer serving cert is signed for DNS names [k8s-master localhost] and IPs [10.0.0.2 127.0.0.1 ::1] [certs] Generating "etcd/healthcheck-client" certificate and key [certs] Generating "apiserver-etcd-client" certificate and key [certs] Generating "sa" key and public key [kubeconfig] Using kubeconfig folder "/etc/kubernetes" [kubeconfig] Writing "admin.conf" kubeconfig file [kubeconfig] Writing "super-admin.conf" kubeconfig file [kubeconfig] Writing "kubelet.conf" kubeconfig file [kubeconfig] Writing "controller-manager.conf" kubeconfig file [kubeconfig] Writing "scheduler.conf" kubeconfig file [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests" [control-plane] Using manifest folder "/etc/kubernetes/manifests" [control-plane] Creating static Pod manifest for "kube-apiserver" [control-plane] Creating static Pod manifest for "kube-controller-manager" [control-plane] Creating static Pod manifest for "kube-scheduler" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Starting the kubelet [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests" [kubelet-check] Waiting for a healthy kubelet at http://127.0.0.1:10248/healthz. This can take up to 4m0s [kubelet-check] The kubelet is healthy after 500.680559ms [api-check] Waiting for a healthy API server. This can take up to 4m0s [api-check] The API server is healthy after 5.001866093s [upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace [kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster [upload-certs] Skipping phase. Please see --upload-certs [mark-control-plane] Marking the node k8s-master as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers] [mark-control-plane] Marking the node k8s-master as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule] [bootstrap-token] Using token: 34rgz6.13kbepd0s1krw5rd [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles [bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes [bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials [bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token [bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace [kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key [addons] Applied essential addon: CoreDNS [addons] Applied essential addon: kube-proxy Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.0.0.2:6443 --token 34rgz6.13kbepd0s1krw5rd \ --discovery-token-ca-cert-hash sha256:e851d897bfb4334afa097c6cdc6b17cad4368a4c19e3f637f1971022a4566a6d

以上返回结果中有 3 条命令需要立即执行,这是用来设置 kubectl 工具的管理员权限,执行之后就可以在 Master 节点上通过终端窗口使用 kubectl 命令。

bash
# 在 Master 节点上执行以下命令 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config

在返回结果的最后 1 条 “kubeadm join” 命令,是用来加入工作节点的,需要在工作节点上执行。

Worker 节点加入 K8s 集群

Master初始化之后,就可以在其他 2 个Worker节点上执行 “kubeadm join” 命令,因为使用了 cri-dockerd ,需要在命令加上 “–cri-socket=unix:///var/run/cri-dockerd.sock” 参数。

bash
# 在两个工作节点上执行 kubeadm join 10.0.0.2:6443 --token f9xunz.m9g4w42g15lps413 --discovery-token-ca-cert-hash sha256:045c07c21136a548a1efbcc2fcb7858dc2b73d31de0ee5f71b67fbe994991ea2 --cri-socket unix:///var/run/cri-dockerd.sock

命令中 token 有效期为 24 小时,当 token 过期之后,执行 “kubeadm join” 命令就会报错。

此时,集群就部署成功了。可以使用 “kubectl get node” 命令来查看集群节点状态。

bash
[root@k8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 84m v1.28.0 k8s-worker1 NotReady <none> 82m v1.28.0 k8s-worker2 NotReady <none> 47s v1.28.0

注意所有节点的状态都是 “NotReady”,这是由于集群还缺少网络插件,集群的内部网络还没有正常运作

bash
[root@k8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 6m32s v1.32.6 k8s-worker-1 NotReady <none> 38s v1.32.6 k8s-worker-2 NotReady <none> 30s v1.32.6
安装 K8s 网络插件

K8s 网络插件,也称为容器网络接口(CNI)插件,是实现 K8s 集群中容器间通信和网络连接的关键组件,否则 Pod 之间无法通信。Kubernetes 支持多种网络方案,这里我们使用 calico。

Calico 是通过执行一个 YAML 文件部署到 K8s 集群里的,所以需要通过 “wget” 命令下载这个 YAML 文件。

bash
# 下载 Calico 插件部署文件 wget https://docs.projectcalico.org/v3.25/manifests/calico.yaml --no-check-certificate

通过 vi 编辑器修改 calico.yaml 文件中的 “CALICO_IPV4POOL_CIDR” 参数,需要与前面 “kubeadm init” 命令中的 “–pod-network-cidr” 参数一样(10.244.0.0/16)。如果文件里的 “CALICO_IPV4POOL_CIDR” 参数前面有 “#”,表示被注释了,需要删除 “#”。 修改位置如下所示。(在 vi 中过输入 /CALICO_IPV4POOL_CIDR 来快速定位到参数位置)

bash
# 修改文件时注意格式对齐 4598 # The default IPv4 pool to create on startup if none exists. Pod IPs will be 4599 # chosen from this range. Changing this value after installation will have 4600 # no effect. This should fall within `--cluster-cidr`. 4601 - name: CALICO_IPV4POOL_CIDR 4602 value: "10.244.0.0/16" 4603 # Disable file logging so `kubectl logs` works. 4604 - name: CALICO_DISABLE_FILE_LOGGING 4605 value: "true"

最后,使用 “kubectl apply” 命令将 Calico 插件部署到集群里,部署 YAML 文件命令如下:

bash
kubectl apply -f calico.yaml

Calico 部署会比较慢,大概等个几分钟,等待 Calico 部署完成后,再次通过命令 “kubectl get node” 查看节点状态,就可以看到所有节点已经准备就绪,此时集群正式搭建成功。

calico拉取失败
kubectl delete -f calico.yaml
bash
国内镜像:https://docker.aityp.com/
手动拉取
bash
# 查看需要拉取的镜像 [root@k8s-master ~]# grep image calico.yaml image: calico/cni:v3.25.0 imagePullPolicy: IfNotPresent image: calico/cni:v3.25.0 imagePullPolicy: IfNotPresent image: calico/node:v3.25.0 imagePullPolicy: IfNotPresent image: calico/node:v3.25.0 imagePullPolicy: IfNotPresent image: calico/kube-controllers:v3.25.0 imagePullPolicy: IfNotPresent
bash
for i in calico/cni:v3.25.0 calico/node:v3.25.0 calico/kube-controllers:v3.25.0 ; do docker pull $i ; done
bash
kubectl apply -f calico.yaml
查看pod状态
bash
[root@k8s-master ~]# kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-54c87cd46c-kqksv 1/1 Running 0 4m51s kube-system calico-node-4brxd 1/1 Running 0 4m51s kube-system calico-node-czjkc 1/1 Running 0 4m51s kube-system calico-node-hdp68 1/1 Running 0 4m51s kube-system coredns-cb4864fb5-69vhh 1/1 Running 0 19m kube-system coredns-cb4864fb5-8t42z 1/1 Running 0 18m kube-system etcd-k8s-master 1/1 Running 4 (10m ago) 9h kube-system kube-apiserver-k8s-master 1/1 Running 4 (10m ago) 9h kube-system kube-controller-manager-k8s-master 1/1 Running 4 (10m ago) 9h kube-system kube-proxy-bc2vm 1/1 Running 2 (10m ago) 8h kube-system kube-proxy-bvvmg 1/1 Running 2 (10m ago) 8h kube-system kube-proxy-rppz4 1/1 Running 4 (10m ago) 9h kube-system kube-scheduler-k8s-master 1/1 Running 4 (10m ago) 9h
查看node状态
bash
[root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 8h v1.32.6 k8s-worker-1 Ready <none> 8h v1.32.6 k8s-worker-2 Ready <none> 8h v1.32.6
集群重置
bash
kubeadm reset 或者kubeadm reset --cri-socket=unix:///var/run/containerd/containerd.sock --v=5 或者kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock --v=5
bash
[root@k8s-master ~]# kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock --v=5 I1019 13:08:55.055661 148978 reset.go:121] [reset] Loaded client set from kubeconfig file: /etc/kubernetes/admin.conf [reset] Reading configuration from the cluster... [reset] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' I1019 13:08:55.068248 148978 kubeproxy.go:55] attempting to download the KubeProxyConfiguration from ConfigMap "kube-proxy" I1019 13:08:55.075420 148978 kubelet.go:74] attempting to download the KubeletConfiguration from ConfigMap "kubelet-config" W1019 13:08:55.126572 148978 preflight.go:56] [reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted. [reset] Are you sure you want to proceed? [y/N]: y

手动清除配置信息,集群内所有机器执行

bash
rm -rf /root/.kube rm -rf /etc/cni/net.d

重新初始化

部署Metrics-Server

下载 metrics-server 官方 yaml:
sh
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.0/components.yaml
修改 metrics-server 启动参数

metrics-server 会请求每台节点的 kubelet 接口来获取监控数据,接口通过 https 暴露,但 Kubernetes 节点的 kubelet 使用的是自签证书,若 metrics-server 直接请求 kubelet 接口,将产生证书校验失败的错误,因此需要在 components.yaml 文件中加上 --kubelet-insecure-tls 启动参数。 components.yaml 文件修改示例如下:

yaml
containers: - args: - --cert-dir=/tmp - --secure-port=443 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - --kubelet-use-node-status-port - --metric-resolution=15s - --kubelet-insecure-tls=true # 加上该启动参数 image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/metrics-server/metrics-server:v0.7.2 # 国内集群,请替换成这个镜像
部署 metrics-server

修改 components.yaml 之后,执行以下命令,通过 kubectl 一键部署到集群:

sh
kubectl apply -f components.yaml
检查运行状态

执行以下命令,检查 metrics-server 是否正常启动。示例如下:

sh
kubectl get pod -n kube-system | grep metrics-server metrics-server-f976cb7d-8hssz 1/1 Running 0 1m

部署 k8s dashboard

shell
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml

注意 k8s 和 dashboard 的版本匹配问题,例如: dashboard v2.5.0 适用 kubernetes v1.23,metrics-scraper v1.0.7 兼容性参考:https://github.com/kubernetes...

命名空间默认为 kubernetes-dashboard,将其修改为 kube-system

shell
sed -i '/namespace/ s/kubernetes-dashboard/kube-system/g' recommended.yaml

NodePort 方式:为了便于本地访问,修改 yaml 文件,将 service 改为 NodePort 类型,同时端口设置为 31260

yaml
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: type: NodePort #增加type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 31260 #增加nodePort: 31260 selector: k8s-app: kubernetes-dashboard

创建dashboard的pod

shell
kubectl apply -f recommended.yaml

访问dashboard

https://masterip:31260

创建 dashboard-adminuser.yaml(创建用户):

shell
[root@k8s-master ~]# cat dashboard-adminuser.yaml --- apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- 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: kube-system [root@k8s-master ~]# kubectl apply -f dashboard-adminuser.yaml serviceaccount/admin-user created clusterrolebinding.rbac.authorization.k8s.io/admin-user created 说明: 上面创建了一个叫 admin-user 的服务账号,并放在 kube-system 命名空间下,并将 cluster-admin 角色绑定到 admin-user 账户,这样 admin-user 账户就有了管理员的权限。默认情况下,kubeadm 创建集群时已经创建了 cluster-admin 角色,直接绑定即可。

创建 admin-user 账户的 token

shell
kubectl create token admin-user -n kube-system --duration=87600h # 10年有效期

拓展

宿主机重启,集群异常
bash
systemctl start docker systemctl start cri-docker systemctl start kubelet journalctl -u kubelet
kubectl自动补全
bash
yum install bash-completion -y source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc
查看和查找资源
# get 命令的基本输出 kubectl get services # 列出当前命名空间下的所有 Service kubectl get pods --all-namespaces # 列出所有命名空间下的全部的 Pod kubectl get pods -o wide # 列出当前命名空间下的全部 Pod 并显示更详细的信息 kubectl get deployment my-dep # 列出某个特定的 Deployment kubectl get pods # 列出当前命名空间下的全部 Pod kubectl get pod my-pod -o yaml # 获取一个 Pod 的 YAML # describe 命令的详细输出 kubectl describe nodes my-node kubectl describe pods my-pod # 列出当前名字空间下所有 Service,按名称排序 kubectl get services --sort-by=.metadata.name # 列出 Pod,按重启次数排序 kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' # 列举所有 PV 持久卷,按容量排序 kubectl get pv --sort-by=.spec.capacity.storage # 获取包含 app=cassandra 标签的所有 Pod 的 version 标签 kubectl get pods --selector=app=cassandra -o \ jsonpath='{.items[*].metadata.labels.version}' # 检索带有 “.” 键值,例如 'ca.crt' kubectl get configmap myconfig \ -o jsonpath='{.data.ca\.crt}' # 检索一个 base64 编码的值,其中的键名应该包含减号而不是下划线 kubectl get secret my-secret --template='{{index .data "key-name-with-dashes"}}' # 获取所有工作节点(使用选择算符以排除标签名称为 'node-role.kubernetes.io/control-plane' 的结果) kubectl get node --selector='!node-role.kubernetes.io/control-plane' # 获取当前命名空间中正在运行的 Pod kubectl get pods --field-selector=status.phase=Running # 获取全部节点的 ExternalIP 地址 kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' # 列出属于某个特定 RC 的 Pod 的名称 # 在转换对于 jsonpath 过于复杂的场合,"jq" 命令很有用;可以在 https://jqlang.github.io/jq/ 找到它 sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?} echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name}) # 显示所有 Pod 的标签(或任何其他支持标签的 Kubernetes 对象) kubectl get pods --show-labels # 检查哪些节点处于就绪状态 JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \ && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True" # 使用自定义列检查哪些节点处于就绪状态 kubectl get node -o custom-columns='NODE_NAME:.metadata.name,STATUS:.status.conditions[?(@.type=="Ready")].status' # 不使用外部工具来输出解码后的 Secret kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}' # 列出被一个 Pod 使用的全部 Secret kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq # 列举所有 Pod 中初始化容器的容器 ID(containerID) # 可用于在清理已停止的容器时避免删除初始化容器 kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3 # 列出事件(Event),按时间戳排序 kubectl get events --sort-by=.metadata.creationTimestamp # 列出所有警告事件 kubectl events --types=Warning # 比较当前的集群状态和假定某清单被应用之后的集群状态 kubectl diff -f ./my-manifest.yaml # 生成一个句点分隔的树,其中包含为节点返回的所有键 # 在复杂的嵌套JSON结构中定位键时非常有用 kubectl get nodes -o json | jq -c 'paths|join(".")' # 生成一个句点分隔的树,其中包含为 Pod 等返回的所有键 kubectl get pods -o json | jq -c 'paths|join(".")' # 假设你的 Pod 有默认的容器和默认的名字空间,并且支持 'env' 命令,可以使用以下脚本为所有 Pod 生成 ENV 变量。 # 该脚本也可用于在所有的 Pod 里运行任何受支持的命令,而不仅仅是 'env'。 for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done # 获取一个 Deployment 的 status 子资源 kubectl get deployment nginx-deployment --subresource=status
删除重启次数非0的pod
kubectl get pods --all-namespaces -o wide | grep -v '0\s' | awk '{print $1, $2}' | xargs -n 2 kubectl delete pod -n