当前位置 : 首页 » 文章分类 :  开发  »  Kubernetes/K8S-安装部署

Kubernetes/K8S-安装部署

Kubernetes/K8S 安装部署笔记


常用k8s部署工具

Docker Desktop for Mac启动Kubernetes

《Docker Desktop for Mac/Windows 开启 Kubernetes》包含详细的操作步骤,按步骤操作即可
AliyunContainerService / k8s-for-docker-desktop
https://github.com/AliyunContainerService/k8s-for-docker-desktop/tree/master

或者

《Docker Desktop for Mac 开启并使用 Kubernetes》
maguowei / k8s-docker-desktop-for-mac
https://github.com/maguowei/k8s-docker-desktop-for-mac

1、拉取 AliyunContainerService / k8s-for-docker-desktop 代码

git@github.com:AliyunContainerService/k8s-for-docker-desktop.git

2、编辑 images.properties 配置文件,将其中的 k8s 组件版本改为和自己 Docker Desktop 中的 k8s 一致的版本。

k8s.gcr.io/pause:3.4.1=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
k8s.gcr.io/kube-controller-manager:v1.21.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.2
k8s.gcr.io/kube-scheduler:v1.21.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.2
k8s.gcr.io/kube-proxy:v1.21.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.2
k8s.gcr.io/kube-apiserver:v1.21.2=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.2
k8s.gcr.io/etcd:3.4.13-0=registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
k8s.gcr.io/coredns:1.8.0=registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.8.0
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1=registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.26.1

3、在 Docker Desktop -> 设置 -> Docker Engine 中配置镜像加速

{
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "20GB"
    }
  },
  "registry-mirrors": [
    "https://8zilvlxr.mirror.aliyuncs.com",
    "https://reg-mirror.qiniu.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com",
    "https://registry.docker-cn.com"
  ],
  "experimental": false,
  "debug": true
}

阿里云镜像加速器地址每个位置的可能不一样,打开下面的链接可看到自己的加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

4、进入 k8s-for-docker-desktop 目录,执行 load_images.sh 脚本拉取 k8s 相关镜像

sh load_images.sh

5、Docker Desktop -> 设置 -> Kubernetes -> 勾选 Enable Kubernetes -> Apply & Restart

一直处于 Starting 状态

勾选 Enable Kubernetes 点 Apply & Restart 后一直处于 Starting 状态
按照网上说的,删除下面这些文件目录后重启 Docker Desktop 还是不行,放弃了。

rm -rf ~/.docker
rm -rf ~/.kube
rm -rf ~/Library/Group\ Containers/group.com.docker/pki/

minikube

包含全部 k8s 特性的单节点环境,主要用作实验学习。
https://minikube.sigs.k8s.io/docs/

kubernetes / minikube
https://github.com/kubernetes/minikube


kops

kops 是官方出的 Kubernetes Operations,适合生产级 K8s 的安装、升级和管理。
https://github.com/kubernetes/kops

可以看做是适用于集群的 kubectl,kops 可帮助您从命令行创建,销毁,升级和维护生产级,高可用性的 Kubernetes 集群。

目前正式支持AWS(Amazon Web Services),其中 GCE 和 OpenStack 处于 beta 测试阶段,而 VMware vSphere 处于 alpha 阶段,并且计划其他平台。

可见,它对云平台结合紧密而提供独特功能,如果未来预见只使用某个云平台,那么相比 kubespray 是更好的选择。


kubeadm

kubeadm 官方维护的为了给创建 Kubernetes 集群提供最佳实践的一个工具,涉及集群生命周期管理等知识。

通过 kubeadm 命令来管理,kubeadm < init | join | upgrade | reset >


kubespray

https://github.com/kubernetes-incubator/kubespray

Kubespray 是由K8S社区孵化的,一个基于Ansible的 K8S 部署工具。

kubespray 是部署生产环境就绪的 Kubernetes 集群的工具。kubernetes-sigs 组织维护。

特点是通过 Ansible 部署,所以相比 kops 方式,kubespray 是 OS 级别通用的部署方式(可以是裸机 或者 云)。

另外 kubespray 2.8 以上版本推荐用 kubeadm 创建集群,以便从中使用生命周期管理的实践 并 卸载其中 OS 配置的东西。

相当于结合了 kubeadm 以及自身的优点。

[K8s] Kubernetes 集群部署管理方式对比, kops, kubeadm, kubespray
https://www.cnblogs.com/farwish/p/12747887.html

Kubo

kubo 是 bosh 用来部署 kubernetes 的一个 release,可以管理 K8S 集群的全生命周期。现在已经被改名为 Cloud Foundry’s Container Runtime。
Bosh 是 Cloud Foundry 的部署工具,不过它也可以用来部署其他分布式系统。 Pivotal 和 Google 公司合作发布的 Kubo(现已改名为CFCR) 项目,就可以让用户通过 Bosh 来部署 Kubernetes 集群。


使用minikube部署单节点k8s v1.20.7

环境:Mac Mojave 10.14.6 8GB i5

Mac brew 安装 minikube

brew install minikube Mac brew 安装 minikube

Possible conflicting files are:
/usr/local/bin/kubectl -> /Applications/Docker.app/Contents/Resources/bin/kubectl
==> Summary
🍺  /usr/local/Cellar/kubernetes-cli/1.21.2: 229 files, 57MB
==> Installing minikube
==> Pouring minikube--1.21.0.mojave.bottle.tar.gz
==> Caveats
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
🍺  /usr/local/Cellar/minikube/1.21.0: 9 files, 63.7MB
==> Caveats
==> minikube
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions

启动 minikube

minikube start 启动 minikube
直接启动的话会报错:

E0628 21:18:28.723318   59233 cache.go:197] Error downloading kic artifacts:  failed to download kic base image or any fallback image
Unable to find image 'gcr.io/k8s-minikube/kicbase:v0.0.23@sha256:baf6d94b2050bcbecd98994e265cf965a4f4768978620ccf5227a6dcb75ade45' locally
docker: Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).

原因:国内无法从 gcr.io 拉取镜像

解决:改为国内镜像仓库 minikube start --memory=3g --cpus=2 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --kubernetes-version=v1.14.10

minikube start --memory=3g --cpus=2 --image-mirror-country='cn' --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers' --kubernetes-version=v1.14.10
😄  Darwin 10.14.6 上的 minikube v1.21.0
✨  自动选择 docker 驱动。其他选项:hyperkit, ssh
✅  正在使用镜像存储库 registry.cn-hangzhou.aliyuncs.com/google_containers
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
🔥  Creating docker container (CPUs=2, Memory=3072MB) ...
    > kubeadm.sha1: 41 B / 41 B [----------------------------] 100.00% ? p/s 0s
    > kubectl.sha1: 41 B / 41 B [----------------------------] 100.00% ? p/s 0s
    > kubelet.sha1: 41 B / 41 B [----------------------------] 100.00% ? p/s 0s
    > kubeadm: 37.77 MiB / 37.77 MiB [--------------] 100.00% 9.01 MiB p/s 4.4s
    > kubectl: 41.12 MiB / 41.12 MiB [---------------] 100.00% 3.86 MiB p/s 11s
    > kubelet: 122.18 MiB / 122.18 MiB [-------------] 100.00% 9.52 MiB p/s 13s

    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5 (global image repository)
🌟  Enabled addons: storage-provisioner, default-storageclass

❗  /usr/local/bin/kubectl is version 1.21.2, which may have incompatibilites with Kubernetes 1.14.10.
    ▪ Want kubectl v1.14.10? Try 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

查看节点信息

查看节点信息及 k8s 版本

kubectl get nodes -o wide
NAME       STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE               KERNEL-VERSION   CONTAINER-RUNTIME
minikube   Ready    control-plane,master   25m   v1.20.7   192.168.64.2   <none>        Buildroot 2020.02.12   4.19.182         docker://20.10.6

查看集群状态

kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0               Healthy     {"health":"true"}

从 v1.19 开始, componentstatus API 被废弃,可以忽略这两个组件的 Unhealthy 状态。

停止minikube

minikube stop 停止集群

minikube stop
✋  Stopping node "minikube"  ...
🛑  1 nodes stopped.

minikube 命令

https://minikube.sigs.k8s.io/docs/commands/

minikube start 启动k8s集群

https://minikube.sigs.k8s.io/docs/commands/start/

--image-mirror-country='': 对于无法访问 gcr.io 的地区,可以设置镜像仓库。设为 auto 时 minikube 会自动自动检测。对于中国大陆用户,可设置为 gcr.io 的镜像仓库例如 registry.cn-hangzhou.aliyuncs.com/google_containers

--image-repository='' 需要使用的镜像镜像的国家/地区代码。留空以使用全球代码。对于中国大陆用户,请将其设置为 cn

--memory='' 为 Kubernetes 分配的 RAM 容量(格式:<数字>[<单位>],其中单位 = b、k、m 或 g)。默认2GB
在 Mac 上,给 minikube 指定的内存必须在给 Docker Desktop 的内存范围之内,否则报错: Exiting due to MK_USAGE: Docker Desktop has only 3936MB memory but you specified 4096MB

--cpus=2 分配给 Kubernetes 的 cpu 个数。默认值是 2

--kubernetes-version='' 启动的k8s版本,可用于启动指定版本的 k8s, 很方便。

minikube delete 删除k8s集群


使用kubeadm安装部署k8s v1.19

kubeadm 是 Kubernetes 官方提供的用于快速安装 Kubernetes 集群的工具箱,比单独安装各个 k8s 组件要方便,还不用担心 k8s 组件之间的版本不兼容问题。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/

参考文档

推荐通过 kubeadm 安装 k8s 集群,英文原版的官方文档最准确,但有些细节和坑没说清楚,有时候遇到问题不知如何解决。
Installing kubeadm(安装kubeadm/kubelet/kubectl)
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Creating a cluster with kubeadm(初始化k8s集群、安装网络插件、添加node、清理)
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

如果按照网上的博客文章安装的话,一定要看好博客中的 k8s 版本,不同版本的配置项差别还是挺大的。

我安装的是 k8s 2020.9.6 最新版 v1.19,一开始参考 v1.10 的安装文档就走了好多弯路,比如设置在开着 swap 的情况下也可以启动 kubelet 的配置时,多数文章中的老方法都不起作用。比如多数文章中的 Helm 都是 V2 版本,还需要安装服务端 Tiller,其实 Helm V3 版本已经不需要 Tiller 这个组件了。

下面列几篇我主要参考的博客文章:

使用kubeadm安装Kubernetes v1.15
https://www.kubernetes.org.cn/5551.html
这篇文章参考价值比较大,里面有正确的开着swap启动kubelet的配置方法,Ingress等应用都是通过Helm部署的,但Helm是v2版本的

Kubernetes(一) 跟着官方文档从零搭建K8S v1.15
https://juejin.im/post/6844903943051411469
这篇文章中网络插件用的是 calico,且是系列文章。

用 kubeadm 搭建集群环境 - 阳明的博客 v1.10
https://www.qikqiak.com/k8s-book/docs/16.%E7%94%A8%20kubeadm%20%E6%90%AD%E5%BB%BA%E9%9B%86%E7%BE%A4%E7%8E%AF%E5%A2%83.html

使用 kubeadm 部署 kubernetes - 《Docker — 从入门到实践》 v1.10
https://yeasy.gitbook.io/docker_practice/setup/kubeadm


Linux系统配置

系统信息

共两台机器,都是 CentOS 7 系统,都是 1vCPU 2GB 内存

lightsail 是 centos 7.6

$ cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
$ uname -a
Linux lightsail 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

linode 是 centos 7.8

$ cat /etc/centos-release
CentOS Linux release 7.8.2003 (Core)
$ uname -a
Linux linode 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

linode 当做 master 节点,lightsail 当做 worker 节点

前提条件

k8s 安装前提条件

  • CentOS 7 及以上系统
  • 2GB 及以上内存
  • 2 核及以上 CPU
  • 多节点之间需要完全网络连通,端口开放
  • 保证各个节点的 mac 地址和 product_uuid 是唯一的
  • 必须禁用 linux swap 交换空间,否则 kubelet 报错无法启动。

Before you begin
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#before-you-begin


内核参数配置

下面网络内核参数是为了保证 iptables 能看到 bridge 流量

1、确保 br_netfilter 模块已加载到 linux 内核
lsmod | grep br_netfilter 有结果就是已加载
如果没加载,执行 sudo modprobe br_netfilter 加载 br_netfilter 模块到内核

2、为了保证 iptables 能看到 bridge 流量,需要确保两个内核参数 net.bridge.bridge-nf-call-ip6tablesnet.bridge.bridge-nf-call-iptables 的值为 1
我两台机器上默认都是 1

$ sysctl net.bridge.bridge-nf-call-ip6tables net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

如果不是,执行下面命令

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

也就是先把内核配置参数保存到自定义的 /etc/sysctl.d/k8s.conf 配置文件中(注意这个文件是自己新建的,之前没有),然后 sudo sysctl --system 命令会加载 /etc/sysctl.d/*.conf 目录中的配置文件(具体可以去了解下 sudo sysctl --system 命令原理)


修改hostname

1、保证两台机器的 hostname 不一样就行了,我这里为了便于识别,设置成了方便记忆的名字。

sudo hostnamectl set-hostname linode
sudo hostnamectl set-hostname lightsail

2、编辑本机 DNS 配置 /etc/hosts, 写入两台机器的 hostname 和 ip 映射关系

192.168.1.1 linode
192.168.1.2 lightsail

关闭firewalld防火墙

CentOS7 中用 firewalld 防火墙代替了 iptables 防火墙,关闭它。
sudo systemctl stop firewalld 关闭 firewalld 防火墙
sudo firewall-cmd --state 查看 firewalld 运行状态,结果是 not running

如果使用的 vps 提供商有其他防火墙配置,也要关闭防火墙或开启对应的接口,比如 aws 需要在web页面上做对应配置。

关闭SELinux访问控制

setenforce 0 将 SELinux 设为 permissive 模式,只告警不限制执行。
getenforce 获取 SELinux 运行状态,结果应该是 Permissive 或 Disabled

关闭swap交换空间

swapoff -a 关闭所有交换空间。
我没有执行这一步,我机器只有 2GB 内存,关闭交换空间后其他应用都没法跑了,我只能开着交换空间,然后修改 kubelet 参数让他在有交换空间的系统上也能启动。


配置各节点互相免密登录

在各个节点上 ssh-keygen 生成密钥对,并把各自的公钥贴到其他节点的 ~/.ssh/authorized_keys 文件(没有则新建)中。
不想手动的话就使用 ssh-copy-id 命令自动考过去。
最终实现各个节点上可以互相免密登录。

lightsail 节点上
1 ssh-keygen -f linode 生成密钥 linode 和 linode.pub
2 拷贝 linode.pub 内容贴到 linode 节点的 ~/.ssh/authorized_keys 文件中。
3 编辑 ~/.ssh/config 文件(没有则新建),配置快速登录

Host linode
    HostName xx.xx.xx.xx
    IdentityFile ~/.ssh/linode
    User linodeuser

保存后直接 ssh linode 即可免密登录到 linode 节点

linode 节点上
1 ssh-keygen -f lightsail 生成密钥 lightsail 和 lightsail.pub
2 拷贝 lightsail.pub 内容到 lightsail 节点的 ~/.ssh/authorized_keys 文件中。
3 编辑 ~/.ssh/config 文件(没有则新建),配置快速登录

Host lightsail
    HostName xx.xx.xx.xx
    IdentityFile ~/.ssh/lightsail
    User lightsailuser

保存后直接 ssh lightsail 即可免密登录到 lightsail 节点


安装docker(或其他容器运行时)

kubeadm 会通过扫描 UDS(Unix Domain Socket) 自动检测已安装的容器引擎,比如

  • Docker /var/run/docker.sock
  • containerd /run/containerd/containerd.sock
  • CRI-O /var/run/crio/crio.sock

docker 18.09 之后,安装 docker 也就自动安装了 containerd 容器运行时,所以会同时检测到这两个容器运行时,这时会优先选择 docker

总之,绝大多数情况下我们直接安装 docker 就好了。

docker 安装参考笔记 Docker
我两台机器上之前都已经在用 docker, 版本分别是:

$ docker -v
Docker version 19.03.5, build 633a0ea
$ docker -v
Docker version 19.03.12, build 48a66213fe

docker 版本 和 k8s 版本之间的兼容性看官方文档:
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker


安装kubeadm/kubelet/kubectl

kubeadm 是启动 k8s 集群的命令工具
kubelet 是用于管理容器生命周期,或者说管理 pod 的
kubectl 是命令行工具,相当于和 k8s 交互的客户端

1 把 kubernetes.repo yum 源中的镜像地址替换为阿里云的

$ cat <<EOF | sudo tee /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

2 安装 kubelet, kubeadm 和 kubectl
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
版本 v1.19

离线安装kubectl

一、背景:
搭建了 3 个节点的 k8s 集群,但只在第一台 master 节点上安装了 kubectl, 在其他两台上无法使用 kubectl, 不方便。

二、需求:
在另外两台节点上也安装 kubectl 命令行工具。

三、步骤:
1、获取 kubectl 可执行文件
在浏览器中访问 https://storage.googleapis.com/kubernetes-release/release/v1.16.3/bin/linux/amd64/kubectl 可直接下载指定版本的 kubectl 的可执行文件。
其中的版本号 v1.16.3 可根据需要修改,访问 https://storage.googleapis.com/kubernetes-release/release/stable.txt 可以查看最新稳定的 k8s 版本号。

2、上传到 centos 服务器后执行 chmod +x kubectl 添加执行权限,之后 mv kubectl /usr/local/bin 放入 bin 目录。

3、此时如果直接执行 kubectl get pod 之类的命令会提示无法连接到 localhost:8080, 因为我们还没配置 kubectl 应该连接的 apiserver 等信息

# kubectl get pod
The connection to the server localhost:8080 was refused - did you specify the right host or port?

出现这个问题的原因是 kubectl 命令需要使用 kubernetes-admin 来运行。
解决方法如下:
(1)从节点创建 $HOME/.kube 目录:mkdir -p $HOME/.kube
(2)将主节点中的 /etc/kubernetes/admin.conf$HOME/.kube/config 配置文件(这两个配置文件是完全一样的)拷贝到从节点的 $HOME/.kube 目录


配置和启动kubelet

安装后 kubelet 会注册成为一个系统服务 /usr/lib/systemd/system/kubelet.service
内容如下:

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

设置开机启动kubelet

sudo systemctl enable kubelet 设置开启启动 kubelet
systemctl list-unit-files |grep kube 查看是否开机启动,结果是 enabled 表示开机启动。


解决k8s必须关闭swap交换空间

Kubernetes 1.8 开始要求关闭系统的 Swap,如果不关闭,默认配置下 kubelet 将无法启动。。
原因主要是为了性能考虑,如果一个 pod 开了交换空间,可能被认为有很多剩余资源,从而被分配较多的实例。
所以关闭 swap 主要是为了性能考虑。

可以通过 kubelet 的启动参数 --fail-swap-on=false 更改这个限制。
kubelet --help 帮助文件中是这么说的

--fail-swap-on Makes the Kubelet fail to start if swap is enabled on the node. (default true) (DEPRECATED: This parameter should be set via the config file specified by the Kubelet’s –config flag. See https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ for more information.)

Kubelet/Kubernetes should work with Swap Enabled #53533
https://github.com/kubernetes/kubernetes/issues/53533
[ERROR Swap]: running with swap on is not supported. Please disable swap #610
https://github.com/kubernetes/kubeadm/issues/610
Error while executing and initializing kubeadm
https://stackoverflow.com/questions/47094861/error-while-executing-and-initializing-kubeadm

网上多数 k8s 安装文档都说是在 systemd 的 conf 文件中加这个配置,比如:

cd /etc/systemd/system
sudo mkdir kubelet.service.d
cd kubelet.service.d
sudo vim 20-allow-swap.conf

填入

[Service]
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

然后

sudo systemctl daemon-reload
kubeadm init --ignore-preflight-errors=Swap

但是这个方法在 v1.19 版本上并不好用,启动 kubelet 还是报错:

9月 06 20:12:40 linode kubelet[10613]: F0906 20:12:40.680096   10613 server.go:265] failed to run Kubelet: running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained: [Filename                                Type                Size        Used        Priority /swapfile1                              file                4194300        440        -2]

在 v1.11+ 以上版本中,真正起作用的是配置 /etc/sysconfig/kubelet 这个文件,里面默认就有个 KUBELET_EXTRA_ARGS= 配置项,改为下面这样:

KUBELET_EXTRA_ARGS=--fail-swap-on=false

然后重启 kubelet,成功在开着 swap 的情况下启动 kubelet

使用kubeadm安装Kubernetes 1.15
https://www.kubernetes.org.cn/5551.html


配置cgroup driver

用 yum 源的方式安装的 kubelet 生成的配置文件将参数 --cgroup-driver 改成了 systemd, 而 docker 的 cgroup-driver 是 cgroupfs, 这二者必须一致。
查看 docker 的 cgroup driver

$ docker info |grep Cgroup
 Cgroup Driver: cgroupfs

官方建议将 cgroup driver 改为 systemd, 因为对于使用systemd作为init system的Linux的发行版,使用systemd作为docker的cgroup driver可以确保服务器节点在资源紧张的情况更加稳定。

创建或修改 /etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

重启docker:

systemctl restart docker

docker info | grep Cgroup
Cgroup Driver: systemd

使用kubeadm安装Kubernetes 1.15
https://www.kubernetes.org.cn/5551.html


启动 kubelet

sudo systemctl start kubelet 启动 kubelet 服务,如果启动后发现进程不存在,可以通过 sudo journalctl -xefu kubelet 查看 kubelet 的启动错误日志。

failed to load Kubelet config file /var/lib/kubelet/config.yaml

1、master 节点上,第一次启动 kubectl 报错,说找不到 /var/lib/kubelet/config.yaml 这个配置文件

9月 05 18:25:42 linode systemd[1]: Started kubelet: The Kubernetes Node Agent.
9月 05 18:25:42 linode kubelet[8144]: F0905 18:25:42.524694    8144 server.go:198] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/k

官方文档说这个配置文件是 kubeadm init 命令生成的,先执行 kubeadm init 生成此配置文件后再启动 kubectl 即可。

2、worker 节点上,第一次启动 kubectl 也报这个错,也找不到 /var/lib/kubelet/config.yaml 配置文件。
注意:不需要手动创建 /var/lib/kubelet/config.yaml 配置文件,通过命令 kubadm join 加入 master 节点上初始化的 k8s 集群后,会自动生成此配置文件


kubeadm init初始化master节点

自定义kubeadm配置文件

kubeadm config print init-defaults 可以打印集群初始化默认使用的配置,我们将其保存为 ~/kubeadm.yaml,然后修改一些参数后使用这个配置文件来执行 kubeadm init

保存默认配置到 ~/kubeadm-init.yaml
kubeadm config print init-defaults > ~/kubeadm-init.yaml

默认配置如下:

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: linode
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.19.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

修改:
1、将 advertiseAddress: 1.2.3.4 修改为 master 节点的地址
2、使用 kubeadm 默认配置初始化的集群,会在 master 节点打上 node-role.kubernetes.io/master:NoSchedule 的污点,阻止 master 节点接受调度运行工作负载。我这里只有两个节点,需要在 master 也参与调度,所以将这个 taint 修改为 node-role.kubernetes.io/master:PreferNoSchedule
见 The NodeRegistration.Taints field is omitted when marshalling kubeadm configuration
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/
3、如果服务器在国内,无法从默认的 imageRepository 拉取镜像的话,可以把镜像仓库地址替换为阿里云的 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers,我这里不需要。

整个修改的部分如下

localAPIEndpoint:
  advertiseAddress: 5.6.7.8
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: linode
  taints:
  - effect: PreferNoSchedule
    key: node-role.kubernetes.io/master

忽略cpu和swap检测错误

不加任何参数执行 sudo kubeadm init 报错:

$ sudo kubeadm init
W0905 21:15:10.516741   14272 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.19.0
[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
    [WARNING Hostname]: hostname "linode" could not be reached
    [WARNING Hostname]: hostname "linode": lookup linode on x.x.x.x:53: no such host
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
    [ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

有两个硬件相关的错误:
1、只有一个 cpu,k8s 安装最少需要 2 个 cpu。可以跳过cpu个数检查 kubeadm init --ignore-preflight-errors=NumCPU
2、我机器只有 2GB 内存,必须开 swap 交换空间才能跑一堆服务,安装 k8s 要求必须关闭 swap,可以跳过 swap 检查 kubeadm init --ignore-preflight-errors=Swap
kubadm init error CPUs 1 is less than required 2(解决cpu问题)
https://stackoverflow.com/questions/60804280/kubadm-init-error-cpus-1-is-less-than-required-2
Error while executing and initializing kubeadm(解决swap问题)
https://stackoverflow.com/questions/47094861/error-while-executing-and-initializing-kubeadm

或者可以直接 --ignore-preflight-errors=all 忽略所有错误。

重复执行kubeadm init报错

假如之前执行过 kubeadm init,改了参数后再次执行时在 preflight 阶段会检查 端口占用 和 要生成的几个配置文件是否已存在并报错,如下:

$ sudo kubeadm init --config kubeadm.yaml
W0906 21:45:26.948291   26488 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.19.0
[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
    [ERROR Port-6443]: Port 6443 is in use
    [ERROR Port-10259]: Port 10259 is in use
    [ERROR Port-10257]: Port 10257 is in use
    [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
    [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
    [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
    [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
    [ERROR Swap]: running with swap on is not supported. Please disable swap
    [ERROR Port-10250]: Port 10250 is in use
    [ERROR Port-2379]: Port 2379 is in use
    [ERROR Port-2380]: Port 2380 is in use
    [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

可以 kubeadm reset 回滚,也可以直接 --ignore-preflight-errors=all 忽略所有错误。

kubeadm reset删除k8s集群

集群安装过程中遇到了其他问题,可以使用下面的命令来进行重置:

$ kubeadm reset
$ ifconfig cni0 down && ip link delete cni0
$ ifconfig flannel.1 down && ip link delete flannel.1
$ rm -rf /var/lib/cni/

Clean up
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#tear-down

kubeadm init成功执行的结果

在开始初始化集群之前可以使用 kubeadm config images pull 预先在各个节点上拉取所 k8s 需要的 docker 镜像,当然也可以不预先拉取,init 中会自动拉取,主要是为了快。

最终,执行 sudo kubeadm init --config ~/kubeadm.yaml --ignore-preflight-errors=all

结果如下:

$ sudo kubeadm init --config kubeadm.yaml --ignore-preflight-errors=all
[sudo] linode 的密码:
W0906 21:51:36.922560   27585 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.19.0
[preflight] Running pre-flight checks
    [WARNING NumCPU]: the number of available CPUs 1 is less than the required 2
    [WARNING Port-6443]: Port 6443 is in use
    [WARNING Port-10259]: Port 10259 is in use
    [WARNING Port-10257]: Port 10257 is in use
    [WARNING FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
    [WARNING FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
    [WARNING FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
    [WARNING FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
    [WARNING Swap]: running with swap on is not supported. Please disable swap
    [WARNING Port-10250]: Port 10250 is in use
    [WARNING Port-2379]: Port 2379 is in use
    [WARNING Port-2380]: Port 2380 is in use
    [WARNING DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
[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] Using existing ca certificate authority
[certs] Using existing apiserver certificate and key on disk
[certs] Using existing apiserver-kubelet-client certificate and key on disk
[certs] Using existing front-proxy-ca certificate authority
[certs] Using existing front-proxy-client certificate and key on disk
[certs] Using existing etcd/ca certificate authority
[certs] Using existing etcd/server certificate and key on disk
[certs] Using existing etcd/peer certificate and key on disk
[certs] Using existing etcd/healthcheck-client certificate and key on disk
[certs] Using existing apiserver-etcd-client certificate and key on disk
[certs] Using the existing "sa" key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/admin.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/scheduler.conf"
[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
[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"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 0.027423 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.19" 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 linode as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node linode as control-plane by adding the taints [node-role.kubernetes.io/master:PreferNoSchedule]
[bootstrap-token] Using token: abcdef.0123456789abcdef
[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

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 192.168.1.5:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:a5bf274e7bfc185bdeff3654c0194959112e2bcc65147e3492a2aae5e303ddb5

出现 Your Kubernetes control-plane has initialized successfully! 就是成功了。

kubeadm init 的过程划分了各个 phase 阶段,如下:
[kubelet-start] 生成kubelet的配置文件 /var/lib/kubelet/config.yaml
[certs] 生成相关的各种证书
[kubeconfig] 生成相关的kubeconfig文件
[control-plane] 使用/etc/kubernetes/manifests目录中的yaml文件创建apiserver、controller-manager、scheduler的静态pod
[bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到

为了使非root用户也能正常使用 kubectl 命令,使用非 root 账户执行
To start using your cluster, you need to run the following as a regular user:
中的命令,这几个命令是为了可以使用 kubectl 工具访问集群

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

注意:最后给出了将节点加入集群的命令 kubeadm join ...,在 worker 节点上执行此命令可以加入 k8s 集群。
其中的 token 只有 24 小时有效期,过期后需要重新生成。

scheduler和controller-manager是Unhealthy状态

执行 kubectl get cs 查看 k8s 集群状态

$ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                              ERROR
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0               Healthy     {"health":"true"}

原因是 /etc/kubernetes/manifests 目录下的 kube-controller-manager.yaml 和 kube-scheduler.yaml 设置的默认端口是0,在文件中注释掉就可以了
在配置项 spec.containers.command.--port 前加 # 号注释掉,两个配置中都是这个配置项。
然后 sudo systemctl restart kubelet.service 重启 kubelet
再次执行 kubectl get cs 查看 k8s 集群状态

$ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true"}

kubectl get nodes 查看节点状态

$ kubectl get nodes
NAME     STATUS     ROLES    AGE   VERSION
linode   NotReady   master   13d   v1.19.0

当前只有一个 master 节点,状态是 NotReady 是因为网络还没配置。

解决kubernetes:v1.18.6 get cs127.0.0.1 connection refused错误
https://juejin.im/post/6860672181060403214


安装Pod Network

为了使 pod 之间可以互相通信,必须安装 Container Network Interface (CNI) 网络插件(network add-on)
常用的网络插件有 flannel 和 calico

k8s集群安装flannel网络插件

以 flannel 网络插件为例。

1、下载 flannel 配置文件
在 master 节点执行

$ cd ~
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2、kubectl apply -f kube-flannel.yml 安装 flannel 网络插件。

$ kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/flannel created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

3、验证所有 Pod 都处于 Running 状态

$ kubectl get pods -A
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   coredns-f9fd979d6-8l6f2          1/1     Running   0          13d
kube-system   coredns-f9fd979d6-bmbnt          1/1     Running   0          13d
kube-system   etcd-linode                      1/1     Running   0          13d
kube-system   kube-apiserver-linode            1/1     Running   0          13d
kube-system   kube-controller-manager-linode   1/1     Running   0          12d
kube-system   kube-flannel-ds-4n9pq            1/1     Running   0          3m1s
kube-system   kube-proxy-mlls6                 1/1     Running   0          13d
kube-system   kube-scheduler-linode            1/1     Running   0          12d

安装网络插件之前,两个 coredns pod 是 Pending 状态,现在是 Running 状态了。

查看 node 状态,发现 master 节点也已经成为 Ready 状态。

$ kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
linode   Ready    master   13d   v1.19.0

k8s集群安装calico网络插件

这个文档中使用的是 calico 网络插件
Kubernetes(一) 跟着官方文档从零搭建K8S
https://juejin.im/post/6844903943051411469


向k8s集群中添加node节点

注意:从开头到 “配置和启动kubelet” 的所有步骤都要在master节点和所有worker节点上执行(worker节点加入k8s集群前kubelet启动会失败),init master节点 和安装 Pod Network 只在master节点执行。

worker 节点上执行

$ sudo kubeadm join 172.105.221.57:6443 --ignore-preflight-errors=all --token d4kxk1.nnzgnb4vnz8qntb6 \
     --discovery-token-ca-cert-hash sha256:a5bf274e7bfc185bdeff3654c0194959112e2bcc65147e3492a2aae5e303ddb5

加入集群成功后输出如下,可以看到 kubeadm 会从 k8s 集群读取配置并写入 /var/lib/kubelet/config.yaml 文件,这个配置文件就是 worker 节点启动 kubelet 报错提示缺少的配置文件。然后还会自动启动 kubelet。

[preflight] Running pre-flight checks
    [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
    [WARNING Swap]: running with swap on is not supported. Please disable swap
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

注意:
1、必须以 root 用户执行 kubeadm join 命令,否则报错

error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR IsPrivilegedUser]: user is not running as root

2、如果没关闭 swap 交换空间 preflight 检查无法通过,可以通过加参数 --ignore-preflight-errors=all 忽略

error execution phase preflight: [preflight] Some fatal errors occurred:
    [ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors=...

3、官方推荐将 cgroup driver 改为 systemd, docker 默认的是 cgroupfs,不过不改也行

[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/

在 master 查看集群节点状态

$ kubectl get nodes
NAME        STATUS   ROLES    AGE     VERSION
lightsail   Ready    <none>   3m28s   v1.19.0
linode      Ready    master   14d     v1.19.0

可以看到 worker 节点已加入 k8s 集群。

初始化master节点生成的token只有24小时有效期

master 节点上 kubeadm init 生成的 token 只有 24 小时有效期(sha值是永久有效的),过期后在 worker 节点执行 kubeadm join 命令时报错:

error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "abcdef"
To see the stack trace of this error execute with --v=5 or higher

解决方法是在 master 节点上重新生成 token

重新生成token

在master节点执行
kubeadm token create 重新生成 token

$ kubeadm token create
W0920 21:47:42.350232   20277 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
d4kxk1.nnzgnb4vnz8qntb6

查看token

在master节点执行
如果没保存 token 值,通过 kubeadm token list 命令可以查看 token

$ kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
d4kxk1.nnzgnb4vnz8qntb6   23h         2020-09-21T21:47:42+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

查看sha值

在master节点执行
如果没保存 sha256 值,通过下面的命令可以查看 sha256 值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

Joining your nodes
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#join-nodes


从k8s集群删除node节点

假如从集群中移除 node2 节点

1、在 master 节点上执行:

kubectl drain node2 --delete-local-data --force --ignore-daemonsets
kubectl delete node node2

2、在 node2 上执行:

$ kubeadm reset
$ ifconfig cni0 down && ip link delete cni0
$ ifconfig flannel.1 down && ip link delete flannel.1
$ rm -rf /var/lib/cni/

3、在其他 node 上执行:

kubectl delete node node2

安装k8s包管理工具Helm v3.3.3

Helm 是最流行的 k8s 包管理工具,后续其他服务都通过 Helm 安装部署。

参考笔记 Helm
注意:Helm V3 及之后,只需安装一个客户端命令行工具 helm,不再需要在 k8s 集群中安装 tiller 了


上一篇 Kubernetes/K8S-kubectl

下一篇 etcd

阅读
评论
9.1k
阅读预计45分钟
创建日期 2021-06-28
修改日期 2021-07-05
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论