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-ip6tables
和 net.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 和 kubectlsudo 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
设置开启启动 kubeletsystemctl 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/
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 了
下一篇 etcd
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: