基于 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. ...
随机推荐
- 鼠标滑至某位置,在鼠标旁边出现详情弹窗div
首先效果如下: 代码如下: //这个是一个循环,循环所有name为xx的td标签(也就是给tdname为XXX的添加事件)$("td[name='strGoodsSKU']").e ...
- 分组在re模块中的使用
import re #search s = "<a>wahaha</a>" #标签语言 html 和 web相关 ret= re.search(" ...
- (ps2018)Adobe Photoshop CC 2018 中文版破解版
ps2018新功能 1.更紧密连接的 Photoshop.全新的智慧型锐利化. 2.智慧型增加取样.内含 Extended 功能.Camera RAW 8 和图层支援 3.可编辑的圆角矩形.多重形状和 ...
- 探寻 webpack_bundle_analyzer 原理
webpack_bundle_analyzer 是什么? 这是webpack官方出品的,对项目中模块依赖关系及体积的分析插件,其界面如下: 问题来了,这是如何来进行统计的? 这里提供一个插件的代码,可 ...
- 数据库系统概念:JDBC
import java.sql.*; public class DataBase { public static void main() { } } /* 5.1.1 JDBC */ class JD ...
- 《C Primer Plus(第6版)中文版》勘误
搬运自己2016年11月28日发布于SegmentFault的文章.链接:https://segmentfault.com/a/1190000007626460 本勘误由本人整理并发布,仅针对下方列出 ...
- 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程
本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...
- 2019牛客暑期多校训练营(第四场)K.number
>传送门< 题意:给你一个字符串s,求出其中能整除300的子串个数(子串要求是连续的,允许前面有0) 思路: >动态规划 记f[i][j]为右端点满足mod 300 = j的子串个数 ...
- 使用ASM实现动态代理
如果对我这段代码感兴趣,直接拷贝测试debug,要不然你不知道我写的是什么鬼,如果有什么问题,可以告诉我. 一.实现动态代理,首先得考虑有应该定义哪些类,根据JDK的动态代理思想,那么它就应该有一个生 ...
- JS面向对象编程(二):构造函数的继承
对象之间继承的 5 中方法. 比如, 现在有一个"动物"对象的构造函数. function Animal(){ ...