基于 kubeadm 部署单控制平面的 k8s 集群

通过搭建单控制平面的 k8s 集群来处理各类非线上业务,特别是作为云原生应用开发、测试、实验学习等场景,虽然不是 HA 部署但也完全够用。本文着重记录单控制平面K8S集群安装,为应用上云、转型云原生应用进行基础储备。
如果资源足够的话(10台以上服务器,3台用于APIserver、3台用于 etcd 存储、至少3台用于工作节点、1台作为负载均衡),可以部署多控制平面的高可用集群环境。下面是高可用集群拓补结构,供参考:

安装步骤不同,但整体思路大同小异,安装时可参考 官网文档,文档清晰明了,也比较好操作。
一、准备工作
硬件资源要求,建议4核心以上CPU,8GB以上内存,Ubuntu 16.04 以上或 CentOS 7以上版本操作系统,确保所有服务器间正常网络通信,1 台服务器作为控制平面节点,其余若干台服务器作为工作节点,我这里准备了4个工作节点。大致信息如下:
| 名称 | CPU | 内存 | IP | OS | 安装 | 用途 | 
|---|---|---|---|---|---|---|
| CPN-1 | 4U | 8GB | 10.163.10.6 | ubuntu18.04 | docker , kubeadm, kubelet , kubectl | Control Plane Node | 
| WN-1 | 4U | 8GB | 10.163.10.7 | ubuntu18.04 | docker , kubeadm, kubelet | Worker Node | 
| WN-2 | 4U | 8GB | 10.163.10.8 | ubuntu18.04 | docker , kubeadm, kubelet | Worker Node | 
| WN-2 | 4U | 8GB | 10.163.10.9 | ubuntu18.04 | docker , kubeadm, kubelet | Worker Node | 
| WN-2 | 4U | 8GB | 10.163.10.10 | ubuntu18.04 | docker , kubeadm, kubelet | Worker Node | 
安装 docker
K8S 支持多种容器运行时环境,这里选择 docker 作为运行时环境,首先为所有节点服务器安装 docker,目前 kubernetes 最新版(v1.15.2) 可以完全兼容支持的 docker 最高版本为 v18.06,所以这里安装 v18.06 这个版本。
参考 官网文档。
# 删除旧版本docker
$ sudo apt-get remove docker docker-engine docker.io containerd runc
# 更新 apt
$ sudo apt-get update
# 安装工具包
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
# 添加Docker官方 GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 添加 stable apt 源
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
# 安装 Docker CE
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
如果因网络环境原因从官网仓库安装速度较慢,可以使用阿里云镜像仓库安装,具体步骤如下:
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
# 选择安装版本,这里选择 19.03.5
apt-cache madison docker-ce
# sudo apt-get -y install docker-ce=[version]
sudo apt-get install docker-ce=5:19.03.5~3-0~ubuntu-bionic docker-ce-cli=5:19.03.5~3-0~ubuntu-bionic containerd.io=1.2.10-3
后续操作
1、当前用户加入"docker"用户组
$ sudo usermod -aG docker $USER
2、 配置 cgroup 驱动为 systemd
#  创建文件 /etc/docker/daemon.json ,内容如下:
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
3、重启服务生效配置
sudo systemctl daemon-reload
sudo systemctl restart docker.service
4、检查配置是否生效
docker info | grep Cgroup
# ECHO ------
Cgroup Driver: systemd
关闭 swap
swapoff -a && sudo sed -i 's/^.*swap/#&/g' /etc/fstab
安装 kubelet kubeadm kubectl
由于网络原因,直接 APT-GET 安装可能安装不了,这里需要配置一下镜像仓库。
1、配置阿里云 kubernetes 镜像仓库
$ sudo apt-get update && sudo apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
2、创建文件 /etc/apt/sources.list.d/kubernetes.list, 内容如下:
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
3、安装 kubelet kubectl kubeadm
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
4、设置kubelet开机启动
$ sudo systemctl enable kubelet
二、部署控制平面节点
过程中会用到一些列 docker 镜像文件,这些文件在 Google 的镜像仓库,可以通过 kubeadm config images pull 命令验证网络是否能够正常拉取镜像。国内环境,十有八九无法直接连接,可从其他镜像仓库下载,然后再修改镜像标签,以便启动相关 pod。
准备镜像
列出安装过程中需要用到的镜像文件,命令为
kubeadm config images list
# ECHO ------
k8s.gcr.io/kube-apiserver:v1.17.0
k8s.gcr.io/kube-controller-manager:v1.17.0
k8s.gcr.io/kube-scheduler:v1.17.0
k8s.gcr.io/kube-proxy:v1.17.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
这里选择从 docker hub 中的 mirrorgooglecontainers 拉取镜像副本,然后更新tag,再删除镜像副本,脚本如下:
images=(kube-apiserver:v1.17.0 kube-controller-manager:v1.17.0 kube-scheduler:v1.17.0 kube-proxy:v1.17.0 pause:3.1 etcd:3.4.3-0 coredns:1.6.5)
for imageName in ${images[@]} ; do
  docker pull gotok8s/$imageName
  docker tag gotok8s/$imageName k8s.gcr.io/$imageName
  docker rmi gotok8s/$imageName
done
初始化控制平面节点
控制平面节点是控制平面组件运行的机器,包括etcd(集群数据库)和 API server (kubectl CLI与之通信)。
需要安装pod网络插件,才能使得集群 pod 间可以相互通信,必须在任何应用程序之前部署 pod 网络。此外,CoreDNS将不会在安装网络之前启动。kubeadm仅支持基于容器网络接口(CNI)的网络,有几个项目使用CNI提供了Kubernetes pod网络,其中一些还支持网络策略。有关可用网络加载项的完整列表,请参阅网络组件页面。
另外,请注意,Pod网络不得与任何主机网络重叠,因为这可能会导致问题。如果发现网络插件的首选Pod网络与某些主机网络之间发生冲突,应为 kubeadm init 指定 --pod-network-cidr 参数配置网络网络,并在网络插件的YAML中修改相应信息。
这里我选择 calico 网络,根据 calico 文档说明,我们需为 kubeadm init 指定 --pod-network-cidr=192.168.0.0/16参数。现在运行 kubeadm init <args> 
sudo kubeadm init \
    --kubernetes-version=v1.17.0 \
    --apiserver-advertise-address=10.163.10.6 \
    --pod-network-cidr=192.168.0.0/16
如果一切正常,安装成功,将输入类似下面的结果信息:
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 10.163.10.6:6443 --token xxxxxx.xxxxxxxxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
根据提示消息,依次执行以下命令:
  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 *** 信息,随后在添加工作节点到集群时需要用到,可以复制后暂存在某个地方。
安装网络
此时,我们通过 kubectl get pods --all-namespaces 命令,应该可以看到 CoreDNS pod  处于 pending 状态,安装网网络以后,它才能处于 running 状态。我们选择 calico 为 pod 提供网络,pod 网络组件本身以 k8s 应用的形式运行,执行下面命令进行安装。
kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
安装了pod网络后,可以通过检查 CoreDNS pod 是否在输出中运行来确认它是否正常工作 kubectl get pods --all-namespaces。
kubectl get pods --all-namespaces
# ECHO ----
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-7bd78b474d-vmq2w   1/1     Running   0          4m57s
kube-system   calico-node-2cwtx                          1/1     Running   0          4m57s
kube-system   coredns-5c98db65d4-gv2j6                   1/1     Running   0          10m
kube-system   coredns-5c98db65d4-n6lpj                   1/1     Running   0          10m
kube-system   etcd-vm-10-13-ubuntu                       1/1     Running   0          8m54s
kube-system   kube-apiserver-vm-10-13-ubuntu             1/1     Running   0          9m10s
kube-system   kube-controller-manager-vm-10-13-ubuntu    1/1     Running   0          9m3s
kube-system   kube-proxy-qbk66                           1/1     Running   0          10m
kube-system   kube-scheduler-vm-10-13-ubuntu             1/1     Running   0          9m8s
pod 启动需要时间,请耐心等待。
三、加入工作节点
CoreDNS pod 启动并运行后,我们可以为集群添加工作节点。工作节点服务器需安装 docker 、kubeadm 和 kubelet,安装过程请参考 master 节点部署流程。
拉取镜像
工作节点服务器需要至少启动两个 pod ,用到的镜像为 kube-proxy 和 pause ,同理我们无法直接从 k8s.grc.io 下载,需要提前拉取镜像并修改 tag ,执行下面命令:
images=(kube-proxy:v1.17.0 pause:3.1)
for imageName in ${images[@]} ; do
  docker pull gotok8s/$imageName
  docker tag gotok8s/$imageName k8s.gcr.io/$imageName
  docker rmi gotok8s/$imageName
done
加入集群
执行控制平面节点初始化完成后提供的添加工作节点命令,格式如下:
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
命令中的 --token 和 --discovery-token-ca-cert-hash 在集群master节点部署完成后的结果信息中有体现,直接复制出来即可使用。
可以通过在控制平面节点执行 kubeadm token list 来获取 token 信息,token 令牌会在 24 小时候失效,如果要创建新的令牌,使用 kubeadm token create 命令。
可以通过下面命令获取 --discovery-token-ca-cert-hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'
注意,如果需要重新执行 kubeadm join ,需在控制平面节点删除该节点 kubectl delete node node-name,并在工作节点上执行 kubeadm reset 进行清理工作。
节点执行完 join 命令后,可以在控制平面节点检查 pod 启动进度 watch kubectl get pods --all-namespaces -o wide,观察新节点服务器上的 pod 状态,正常启动则加入成功且节点状态为 Ready。参照上述步骤,依次将所有工作节点加入集群。
检查工作节点状态
工作节点加入集群后,随着工作节点上相应 pod 的正常启动,工作节点状态会由 NotReady 切换到 Ready,Pod 启动需要时间,请耐心等待。所有节点正常加入集群后,可以通过命令查看节点状态:
kubectl get nodes
# ECHO ------
NAME              STATUS   ROLES    AGE    VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
vm-10-6-ubuntu   Ready    master   9h     v1.15.2   10.163.10.13   <none>        Ubuntu 18.04.1 LTS   4.15.0-54-generic   docker://18.6.3
vm-10-7-ubuntu   Ready    <none>   9h     v1.15.2   10.163.10.12   <none>        Ubuntu 18.04.1 LTS   4.15.0-54-generic   docker://18.6.3
vm-10-8-ubuntu    Ready    <none>   9h     v1.15.2   10.163.10.9    <none>        Ubuntu 18.04.1 LTS   4.15.0-54-generic   docker://18.6.3
vm-10-9-ubuntu    Ready    <none>   8h     v1.15.2   10.163.10.7    <none>        Ubuntu 18.04.1 LTS   4.15.0-54-generic   docker://18.6.3
vm-10-10-ubuntu    Ready    <none>   120m   v1.15.2   10.163.10.2    <none>        Ubuntu 18.04.1 LTS   4.15.0-54-generic   docker://18.6.3
四、安装 dashboard
dashboard 不会随集群一起安装,需要单独部署,执行下面命令安装:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta3/aio/deploy/recommended.yaml
这里要注意 dashboard 的版本,并非所有版本的 dashboard 都能和任意版本的 k8s 集群完全兼容。引用官网对照表
| Kubernetes version | 1.11 | 1.12 | 1.13 | 1.14 | 1.15 | 
|---|---|---|---|---|---|
| Compatibility | ? | ? | ? | ? | ✓ | 
✓ Fully supported version range.
? Due to breaking changes between Kubernetes API versions, some features might not work correctly in the Dashboard.
默认情况下,Dashboard 使用最小 RBAC 配置进行部署。目前,Dashboard 仅支持使用 Bearer Token 登录。可以按照关于创建示例用户的指南 进行操作。
关于 dashboard 的使用,随后会抽时间再详细写一篇进行介绍。
五、Inress
- 选择一个节点,打上 - node.k8s.xx.cn/role: ingress标签,已实现下一步进行 Pod 调度。
- 安装下载 ingress-nginx 资源信息 
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
- 修改配置信息
修改 nginx-ingress 安装文件 mandatory.yaml,以确保 nginx-ingress-controller 运行在指定节点上。
...
      nodeSelector:
        kubernetes.io/os: linux
        node.k8s.xx.cn/role: ingress
      serviceAccountName: nginx-ingress-serviceaccount
...
配置 service 为集群 IP 类型,使用外部 IP 暴露服务。
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: ClusterIP
  externalIPs:
    - 10.163.10.7
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
---
- 安装 ingress-nginx
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml
六、结语
现在我们已经拥有一个 4 工作节点的单控制平面 k8s 集群,本文仅简单介绍了部署过程,关于集群的管理、使用还会涉及到非常多 k8s 概念及领域知识,官网文档基本上很详细的介绍了各类概念,还有详尽的操作演示,可以多看、多实践。
最后,祝大家身体健康、工作顺利、万事如意。
基于 kubeadm 部署单控制平面的 k8s 集群的更多相关文章
- 使用kubeadm部署一套高可用k8s集群
		使用kubeadm部署一套高可用k8s集群 有疑问的地方可以看官方文档 准备环境 我的机器如下, 系统为ubuntu20.04, kubernetes版本1.21.0 hostname IP 硬件配置 ... 
- 【K8S】基于单Master节点安装K8S集群
		写在前面 最近在研究K8S,今天就输出部分研究成果吧,后续也会持续更新. 集群规划 IP 主机名 节点 操作系统版本 192.168.175.101 binghe101 Master CentOS 8 ... 
- 1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)
		公众号关注「WeiyiGeek」 设为「特别关注」,每天带你玩转网络安全运维.应用开发.物联网IOT学习! 本章目录: 0x00 前言简述 0x01 环境准备 主机规划 软件版本 网络规划 0x02 ... 
- 二进制部署1.23.4版本k8s集群-5-部署Master节点服务
		1.安装Docker 在21.22.200三台机器上安装Docker.安装命令: 在21.22.200三台主机上部署Docker. ~]# curl -fsSL https://get.docker. ... 
- 二进制部署1.23.4版本k8s集群-6-部署Node节点服务
		本例中Master节点和Node节点部署在同一台主机上. 1 部署kubelet 1.1 集群规划 主机名 角色 IP CFZX55-21.host.com kubelet 10.211.55.21 ... 
- 【k8s学习笔记】使用 kubeadm 部署 v1.18.5 版本 Kubernetes集群
		说明 本文系搭建kubernetes v1.18.5 集群笔记,使用三台虚拟机作为 CentOS 测试机,安装kubeadm.kubelet.kubectl均使用yum安装,网络组件选用的是 flan ... 
- 京东云开发者|IoT运维 - 如何部署一套高可用K8S集群
		环境 准备工作 配置ansible(deploy 主机执行) # ssh-keygen # for i in 192.168.3.{21..28}; do ssh-copy-id -i ~/.ssh/ ... 
- 利用shell脚本[带注释的]部署单节点多实例es集群(docker版)
		文章目录 目录结构 install_docker_es.sh elasticsearch.yml.template 没事写写shell[我自己都不信,如果不是因为工作需要,我才不要写shell],努力 ... 
- 二进制部署1.23.4版本k8s集群-1-系统安装及环境准备
		1. 致谢 这篇文章参考了老男孩王导的视频,在此表示感谢和致敬! 2. 安装CentOS操作系统 系统镜像:CentOS-7-x86_64-DVD-2009.iso 安装过程略. 3. 环境准备 3. ... 
随机推荐
- django执行mysql恢复的时候出现“The request's session was deleted before the request completed. The user may have logged out in a concurrent request, for example.”
			版本: django:2.1.7 python:3.7 mysql:5.7.25 今天在用django做mysql备份和恢复的时候,备份没问题,恢复时出现如下错误提示: The request's s ... 
- S7-1200与S7-200  通信西门子链接
			只要这两从站的通讯格式时一样的,而且都为modbus rtu格式的话,是可以走modbus通讯.你在用主站在编程时直接调用modbus rtu通讯库.同时200做为从站,在程序里面将从站的程序写好. ... 
- 深入理解Java虚拟机一  阅读笔记
			xl_echo编辑整理.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! --- > 以下内容摘抄自 ... 
- C# 与 JS 之间传值在 cshtml页面中
			@{ string It = "sss"; ; } @functions{ string Mod = "ajssaioi"; public string Itm ... 
- motion做摄像头(ZC3XX)移动物体监控系列问题
			一:插入摄像头USB没有显示 gspca: video x creat 解决:cd /dev ls |grep video 进入/dev目录下,运行ls |grep video命 ... 
- JavaScript作用域及预编译
			几乎所有的编程语言都可以存储,访问,修改变量,那在JavaScript中这些变量放在那里?程序如何找到他们? js被归类于解释执行语言,但事实上他也是一门编译语言,因为他也要编译,但于传统的编译语言不 ... 
- springboot快速入门02--Controller编写和测试
			02springboot快速入门--Controller编写和测试 1.新建一个HelloController import org.springframework.boot.SpringApplic ... 
- 将 unsiged char 转换成对应的十六进制字符用以显示出来如 unsiged char a[]={0x00,0x01,0x30,0x38}转化为“00013038”
			int CEnCryptionAndDeCryptionDlg::Byte2Hex(const unsigned char* input,unsigned long inLen, unsigned c ... 
- 比赛:小奔与不等四边形solution
			题目: 题目背景 有这样一道经典的数学题:已知一个四边形的边长是四个连续的正整数,求证这个四边形的面积的最大值不为整数.小奔轻松地证明了这个问题,现在问题来了,大奔要求小奔以最快的速度算出给定边长的四 ... 
- matlab考试重点详解
			此帖是根据期末考试复习重点补充完成, 由于使用word编辑引用图片和链接略有不便, 所以开此贴供复习及学习使用.侵删 复习要点 第一章 Matlab的基本概念,名称的来源,基本功能,帮助的使用方法 1 ... 
