使用kubeadmin 构建单control-plane节点k8s集群

install-kubeadm/
create-cluster-kubeadm/

control-plane
https://www.rfc-archive.org/getrfc.php?rfc=3746
网络层面的定义。control plane , data plane。

1. 网络配置准备

开启br_netfilter mod

test@single_k8s:~$ lsmod |grep br_netfilter
test@single_k8s:~$ sudo modprobe br_netfilter
[sudo] password for test: 
test@single_k8s:~$ lsmod |grep br_netfilter
br_netfilter           24576  0
bridge                155648  1 br_netfilter

配置内核

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
test@single_k8s:~$ sudo sysctl -a |grep bridge-nf-call
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens160.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"

2. 安装runtime

Kubernetes 使用 container runtime 来在Pods中运行容器。

container runtime
负责运行容器的软件。

默认,Kubernetes 使用 Container Runtime Interface (CRI) 来面向 container runtime
默认,Kubeadm 使用 Docker 作为 container runtime
Kubelet 通过内建的 dockershim CRI 实现与 Docker 的集成。

root@single_k8s:~# apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2

root@single_k8s:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
OK

root@single_k8s:~# add-apt-repository   "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

root@single_k8s:~# apt-get update && apt-get install -y   containerd.io=1.2.13-1   docker-ce=5:19.03.8~3-0~ubuntu-$(lsb_release -cs)   docker-ce-cli=5:19.03.8~3-0~ubuntu-$(lsb_release -cs)

root@single_k8s:~# cat /etc/docker/daemon.json 
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}


root@single_k8s:~# mkdir -p /etc/systemd/system/docker.service.d
root@single_k8s:~# systemctl daemon-reload
root@single_k8s:~# systemctl restart docker

test@single_k8s:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

3. 安装 kubeadm, kubelet and kubectl

国内连不上google的,所以必须手动安装

test@single_k8s:~$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl

test@single_k8s:~$ cat /etc/apt/sources.list.d/kubernetes.list 
deb https://apt.kubernetes.io/ kubernetes-xenial main

国内源安装
如下使用root执行

sudo apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

安装指定版本的kubernetes

apt-get install kubeadm=1.10.2-00 kubectl=1.10.2-00 kubelet=1.10.2-00

4. 初始化 control-plane 节点

Control-plane 节点即为运行 control plane 组件的主机,包括 etcdAPI Server (用于对接 kubectl )。

(推荐) 如果有计划升级 单control-plane节点集群到 HA ,建议配置 --control-plane-endpoint 来设置 shared endpoint 来向所有 control-plane 节点提供访问。Endpoint 可以是 DNS name 或 负载均衡IP 。

选择 Pod 网络插件, 然后确认是否有参数提交给 kubeadm init。取决与你选择的第三方插件,你可能需要设置 --pod-network-cidr 为第三方指定的值。参见 Installing a Pod network add-on

(可选) 自版本 1.14 以后, kubeadm 使用一份domain socket paths清单来自动发现容器运行环境。如果使用不同的容器环境,或者安装了多个,需要指定 --cri-socket 参数给 kubeadm init。参见 Installing runtime.

(可选) 除非特别指定,kubeadm 使用默认网关对应的网卡接口地址作为这个control-plane 节点 API server的通告地址。要使用其他网络接口地址,需要指定 --apiserver-advertise-address=<ip-address>参数给 kubeadm init。要部署使用IPv6,需要指定IPv6地址,比如 --apiserver-advertise-address=fd00::101

(可选) 运行 kubeadm config images pull prior to kubeadm init to verify connectivity to the gcr.io container image registry.

kubeadm init <args>

Considerations about apiserver-advertise-address and ControlPlaneEndpoint

--apiserver-advertise-address 可以设置 control-plane 节点 API server 的 通告地址。
--control-plane-endpoint 可以设置所有control-plane 节点的 shared endpoint。
--control-plane-endpoint 允许IP地址,也允许DNS names。请联系管理员设置DNS和IP的映射。

More information

如果加入的节点与cluster部署于同一架构,要确保部署的 DaemonSets 支持这种架构的容器镜像。

kubeadm init 在运行Kubernetes前会执行一系列预检,来确保可以运行Kubernetes。这些预检会报warnings ,或者在errors的时候退出。
kubeadm init 然后下载和安装cluster control plane的组件。

  • 如果以非root用户运行 kubectl ,配置如下:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 如果以root用户运行 kubectl,配置如下:
export KUBECONFIG=/etc/kubernetes/admin.conf

使用 kubeadm join 命令添加节点到集群,参见 join nodes to your cluster.

Token 用于 control-plane 节点 和 joining 节点之间的认证。Token的内容要保密,任何拥有token的人都可以添加认证的节点到集群。Token 可以通过kubeadm token命令执行 listed, created, deleted 。参见 kubeadm reference guide.

5. 安装Pod网络插件

注意:
这里有网络设置和部署顺序的重要内容。
必须部署基于Pod网络插件的Container Network Interface (CNI) ,这样 Pods 之间才可以互相通信。Cluster >DNS (CoreDNS) 在Pod网络插件安装前不会启动。

  • Pod network 必须不能与 host networks 重叠。
    (如果 Pod network 和 某些host networks冲突,要考虑使用 CIDR block 来替代,然后 kubeadm init指定 --pod-network-cidr ,以及替换network插件的YAML内容。)。

  • 默认, kubeadm在设置集群的时候会开启 RBAC (role based access control)。
    确保 Pod network plugin 支持 RBAC,然后按提示部署。

  • 如果使用双栈IPv6,或在cluster内使用单栈IPv6,确保 Pod network plugin 支持IPv6。
    IPv6 的支持在 v0.6.0 添加到 CNI 。

一个集群只能安装一个 Pod network 。
使用如下命令在 control-plane 节点或拥有kubeconfig credentials的节点安装 Pod network 插件。

kubectl apply -f <add-on.yaml>

如下网络插件:


Calico

Calico提供networking和network policy。Calico 提供一些可选的网络配置集,根据你的环境选择最有效的配置,比如是否可重叠网络,是否拥有BGP。Calico 使用同一个引擎来向hosts, pods, 和工作在service mesh层的applications(如果开启Istio & Envoy)提供network policy。Calico 支持 amd64, arm64, and ppc64le 架构。
Calico 会基于--pod-network-cidr或 kubeadm’s configuration 自动检测pods使用的IP范围。

kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

Cilium

Cilium 可以作为 kube-proxy 的替代,参见 Kubernetes without kube-proxy

关于在Kubernetes上使用Cilium的更多内容,参见Kubernetes Install guide for Cilium

Cilium 需要在kubeadm init添加 --pod-network-cidr=10.217.0.0/16参数。
部署 Cilium :

kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.6/install/kubernetes/quick-install.yaml

当所有的 Cilium Pods 标记为 READY,就可以使用了。如下:

kubectl get pods -n kube-system --selector=k8s-app=cilium
NAME           READY   STATUS    RESTARTS   AGE
cilium-drxkl   1/1     Running   0          18m

Contiv-VPP

Contiv-VPP 使用了基于FD.io VPP的可编程 CNF vSwitch,提供多功能&高性能的云原生网络和服务。

它在用户空间层实现 k8s 服务和网络策略(on VPP)。

Contiv-VPP Manual Installation

Kube-router

Kube-router 依赖 kube-controller-manager 来分配Pod CIDR地址。因此,kubeadm init 使用配置项 --pod-network-cidr

Kube-router 提供 Pod 网络、网络策略、高性能的基于IP Virtual Server(IPVS)/Linux Virtual Server(LVS) 的服务代理。

设置参见setup guide

Weave Net

Weave Net集成,参见 Integrating Kubernetes via the Addon.

Weave Net 支持 amd64, arm, arm64 and ppc64le 架构,而不需要额外的设置。Weave Net 默认设置为 hairpin 模式。这允许Pods在不知道它们的PodIP,以Service IP address访问它们自己。


Pod network 安装完毕后,可以通过查看CoreDNS Pod 正在 Running来判断是否安装成功。查看命令kubectl get pods --all-namespaces。在 CoreDNS Pod 起来并且运行后,你才可以添加节点进集群。

如果 network 没有工作,或者 CoreDNS 不在 Running 状态,参见 troubleshooting guide

6. Control Plane 节点隔离

默认,基于安全原因,集群并不会在control-plane节点上部署Pods。如果你需要在control-plane上部署Pods,比如用于development的单主机集群,需要执行如下:

kubectl taint nodes --all node-role.kubernetes.io/master-

输出范例如下:

node "test-01" untainted
taint "node-role.kubernetes.io/master:" not found
taint "node-role.kubernetes.io/master:" not found

这将从任何拥有node-role.kubernetes.io/master taint的节点上删除它, 包括control-plane节点,即意味着scheduler可以规划、部署Pods在任何地方。

7. 添加节点

节点( nodes )即容器(containers and Pods...)运行的地方。添加节点到集群,执行如下操作:

  • SSH 到指定主机
  • 切到 root (比如 sudo su -)
  • 执行kubeadm init完毕时提示的如下命令。如下:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

如果不知道 token,你可以在control-plane节点上执行如下命令查看:

kubeadm token list

输出范例:

TOKEN                    TTL  EXPIRES              USAGES           DESCRIPTION            EXTRA GROUPS
8ewj1p.9r9hcjoqgajrj4gi  23h  2018-06-12T02:51:28Z authentication,  The default bootstrap  system:
                                                   signing          token generated by     bootstrappers:
                                                                    'kubeadm init'.        kubeadm:
                                                                                           default-node-token

默认,tokens 超时时间是24小时。如果你在当前token过期后添加节点,你可以在control-plane节点上执行如下命令创建新token:

kubeadm token create

输出范例:

5didvk.d09sbcov8ph2amjw

如果你没有 --discovery-token-ca-cert-hash,你可以在control-plane节点执行如下命令获取:

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

输出范例:

8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78

Note:如果<control-plane-host>:<control-plane-port>指定IPv6地址 ,IPv6 地址必须被方括号包围,比如: [fd00::101]:2073

添加节点成功的输出范例:

[preflight] Running pre-flight checks

... (log output of join workflow) ...

Node join complete:
* Certificate signing request sent to control-plane and response
  received.
* Kubelet informed of new secure connection details.

Run 'kubectl get nodes' on control-plane to see this machine join.

(可选) 在非control-plane节点上控制集群

要在其他地方(比如:你的笔记本)上通过kubectl连到集群,你需要从control-plane节点上拷贝administrator kubeconfig file 到你的电脑,如下:

scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes

Note:范例开启了root的SSH访问权限。如果没有权限,可以拷贝 admin.conf 文件到其他可访问的用户目录,然后用那个用户拷贝过去。admin.conf 文件给与了集群的超级管理员权限。尽量不要使用这个文件。对于普通用户,建议根据你的白名单权限创建唯一的收取按。使用如下命令 kubeadm alpha kubeconfig user --client-name <CN>。这个命令会输出KubeConfig文件到STDOUT,然后你需要保存它并发布给你的用户。之后,执行kubectl create (cluster)rolebinding 进行白名单授权。

(Optional) Proxying API Server to localhost

如果你需要在集群外访问API Server,你可以使用kubectl proxy:

scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf proxy

现在你可以在本地通过http://localhost:8001/api/v1访问 API Server了。

8. 清除集群

如果你使用的可自由支配的服务器,构建的集群是临时测试使用,你可以关闭集群,而不需要更深入的clean up。你可以使用 kubectl config delete-cluster 来删除集群。

但是如果你要更深度的清理,首先需要 drain the node 并且确认节点空了,然后再删除该节点的配置。

Remove the node

使用适当的凭据与 control-plane 节点通信:

kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>

然后,在被removed的节点上, reset 所有 kubeadm 安装的状态:

kubeadm reset

Reset 进程不会重置或清理iptables rules or IPVS tables。
如果需要重置iptables,手动操作:

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

如果需要重置IPVS tables,手动执行如下命令:

ipvsadm -C

如果If you wish to start over simply run kubeadm init or kubeadm join with the appropriate arguments

Clean up the control plane

在control plane节点使用kubeadm reset 可以触发最有效的清理。
参考 kubeadm reset

What's Next

Feedback

版本偏移

kubeadm 工具 v1.18 的版本可以部署v1.18 or v1.17 版本control plane的集群。kubeadm v1.18 也可以用于升级v1.17版本kubeadm创建的集群。

但是我们不知道未来,所以kubeadm CLI v1.18 可以,或许不可以部署v1.19集群。

如下资源提供了关于kubelets,control plane,其他Kubernetes 组件版本偏移的更多信息。

限制

集群的弹性/快速恢复

这里创建的cluster有一个单control-plane节点,运行了单 etcd 数据库。这意味着,如果control-plane节点故障了,集群会丢失数据,或者需要recreate。

Workarounds:

平台兼容

kubeadm deb/rpm 包和二进制 编译支持平台 amd64, arm (32-bit), arm64, ppc64le, and s390x following the multi-platform proposal.

自v1.12版本后,control plane and addons的多平台容器镜像也被支持了。

只有部分network providers 提供全平台支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352