使用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 <
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 <
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 组件的主机,包括 etcd 和 API 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=参数给 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 

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

  • kubeadm init 参数,参见 kubeadm reference guide。
  • 配置列表,参见 configuration file documentation.
  • 定制化 control plane 组件,比如可选的IPv6 assignment to liveness probe for control plane components 和 etcd server,提供额外的配置参数,参见 custom arguments.
  • 重复执行 kubeadm init ,必须先执行 tear down the cluster.

如果加入的节点与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 

如下网络插件:


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  : --discovery-token-ca-cert-hash sha256:

如果不知道 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:如果:指定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@:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes

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

(Optional) Proxying API Server to localhost

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

scp root@:/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  --delete-local-data --force --ignore-daemonsets
kubectl delete node 

然后,在被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

  • Verify that your cluster is running properly with Sonobuoy
  • See Upgrading kubeadm clusters for details about upgrading your cluster using kubeadm.
  • Learn about advanced kubeadm usage in the kubeadm reference documentation
  • Learn more about Kubernetes concepts and kubectl.
  • See the Cluster Networking page for a bigger list of Pod network add-ons.
  • See the list of add-ons to explore other add-ons, including tools for logging, monitoring, network policy, visualization & control of your Kubernetes cluster.
  • Configure how your cluster handles logs for cluster events and from applications running in Pods. See Logging Architecture for an overview of what is involved.

Feedback

  • For bugs, visit the kubeadm GitHub issue tracker
  • For support, visit the #kubeadm Slack channel
  • General SIG Cluster Lifecycle development Slack channel: #sig-cluster-lifecycle
  • SIG Cluster Lifecycle SIG information
  • SIG Cluster Lifecycle mailing list: kubernetes-sig-cluster-lifecycle

版本偏移

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 组件版本偏移的更多信息。

  • Kubernetes version and version-skew policy
  • Kubeadm-specific installation guide

限制

集群的弹性/快速恢复

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

Workarounds:

  • Regularly back up etcd。kubeadm 配置的 etcd 数据目录位于control-plane节点的 /var/lib/etcd

  • 使用多 control-plane 节点。参见Options for Highly Available topology 来选择一个提供HA的集群拓扑。

平台兼容

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

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

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

你可能感兴趣的:(使用kubeadmin 构建单control-plane节点k8s集群)