CentOS7 Kubeadm 部署Kubernetes 1.20.0

前言

注明:理论知识部分来源于阿良教育:www.aliangedu.cn

1、有了Docker,为什么还用Kubernetes?

Docker这几年在容器化领域,可谓是出尽风头。其基于应用做环境隔离,资源限制,快速部署,统一环境的特性都是他被各大互联网公司使用的原因。那有了Docker,为什么还要用Kubernetes呢?试想一下,公司90%的业务都上容器化了,那需要承载他的服务器数量有多少(Docker主机),容器又有多少(从Docker的设计思想来看一个容器就是一个应用),数量肯定是大量的。那我们怎么样做管理呢?而且最重要的是业务的可用性与稳定性怎么样保障呢?因此Kubernetes的出现正是解决,多容器跨主机提供服务,多容器升级,业务高可用,高效运维等问题。


2、Kubernetes是什么?

Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称为K8S
Kubernetes用于容器化应用程序的部署,扩展和管理,目标是让部署容器化应用简单高效。
官方网站:https://www.kubernetes.io/
官方文档:https://kubernetes.io/zh/docs/home


3、Kubernetes集群架构与组件

在这里插入图片描述

一个K8S集群主要有以下组件,各个组件的作用与关系描述如下
管理节点/Master:

  • kubectl:管理集群工具(命令行工具)
  • API Server:Kubernetes API,集群的统一入口,各组件协调者,以RESTful API 提供接口服务,所有对象资源的增删改查和监听操作都交给API Server处理后再提交给Etcd存储
  • scheduler:根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上
  • controller-manager:处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。
  • etcd:分布式键值存储系统。用于保存集群状态数据,比如Pod,Service等对象信息。

工作节点/Node

  • kubelet:kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器,Pod挂载数据卷,下载secret获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
  • kube-proxy:在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡规则。
  • docker或rocket:容器引擎,运行容器。

K8S集群的部署方式主要有两种,使用官方的快速部署集群工具kubeadm与二进制部署。此篇文章主要介绍使用kubeadm快速部署一个K8S集群。
官方部署文档:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/


4、kubeadm工具功能

  • kubeadm init:初始化一个Master节点
  • kubeadm join:将工作节点加入集群
  • kubeadm upgrade:升级K8S版本
  • kubeadm token:管理
  • kubeadm join使用的令牌
  • kubeadm reset:清空kebeadm init或者kubeadm join对主机所做的任何更改
  • kubeadm version:打印kubeadm版本
  • kubeadm alpha:预览可用的新功能

具体每个功能怎么样使用,可以查看官方文档:https://kubernetes.io/docs/reference/setup-tools/kubeadm/


一、环境确定

1.1 软件版本

软件版本
操作系统CentOS Linux release 7.9.2009 (Core)
Docker20.10.7-CE
Kubernetes1.20.0

1.2 服务器IP规划

主机名IP地址角色
master192.168.16.70K8S-Msater节点
master192.168.16.71K8S-node1节点
master192.168.16.72K8S-node2节点

二、系统初始化

###以下操作所有服务器节点均需要执行

2.1 关闭firewall防火墙及selinux

[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# setenforce 0	#临时关闭selinux
[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config		#永久关闭selinux,需要重启系统生效
[root@master ~]# getenforce		#查看selinux当前状态

2.2 关闭swap交换分区

[root@master ~]# swapoff -a		#临时关闭
[root@master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab		#永久关闭

2.3 设置主机名通信

[root@master ~]# cat >> /etc/hosts << EOF
192.168.16.70 master
192.168.16.71 node1
192.168.16.72 node2
EOF

2.4 桥接流量传递到iptables链

[root@master ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master ~]# sysctl --system

2.5 时间同步

[root@master ~]# yum install ntpdate -y
[root@master ~]# ntpdate time.windows.com

三、安装Docker,kubeadm,kubelet,kubectl

###以下操作所有服务器节点均需要执行

3.1 安装Docker

[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo	#安装阿里云docker源
[root@master ~]# yum clean all && yum makecache	#清理并重建缓存
[root@master ~]# yum install -y docker-ce	        #安装最新版本的docker-ce,如需安装特定版本的docker-ce跟上版本号
[root@master ~]# systemctl start docker		#启动dokcer守护进程
[root@master ~]# systemctl enable docker		#设置docker为自启动
[root@master ~]# docker version			#查看docker版本信息

在这里插入图片描述


3.2 配置Docker镜像加速

[root@master ~]# mkdir -p /etc/docker
[root@master ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
[root@master ~]# docker info		#查看docker详细信息

在这里插入图片描述


3.3 配置kubernetes yum源

[root@master ~]# cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@master ~]# yum clean all && yum makecache

3.4 安装kubeadm,kubectl,kubelet

[root@master ~]# yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0	#安装指定版本
[root@master ~]# systemctl enable kubelet	#设置kubelet开机自启动

在这里插入图片描述


四、集群初始化

###以下操作只需要在Master节点执行即可

4.1 执行kubeadm init初始化

[root@master ~]# kubeadm init \
   --apiserver-advertise-address=192.168.16.70 \
   --image-repository registry.aliyuncs.com/google_containers \
   --kubernetes-version v1.20.0 \
   --service-cidr=10.96.0.0/12 \
   --pod-network-cidr=10.244.0.0/16 \
   --ignore-preflight-errors=all
--apiserver-advertise-address:设置Master节点API Server的监听地址
--image-repository:设置容器镜像拉取地址
--kubernetes-version:设置K8S版本,需与您安装的保持一致
--service-cidr:集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr:Pod网络,与部署CNI网络组件yaml文件中需保持一致
--ignore-preflight-errors:其错误将显示为警告的检查列表,值为 'all' 忽略所有检查中的错误。 

更多执行init时的参数可查看官方文档:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

init执行流程:

  1. [preflight] 环境检查,拉取镜像
  2. [certs] 证书生成
  3. [kubeconfig] kubeconfig文件生成
  4. [kubelet-start] 生成kubelet配置文件并启动
  5. [control-plane]静态pod启动master组件,包括了etcd
  6. [mark-control-plane] 给master节点打一个roles和污点
  7. [bootstrap-token] 引导kubelet生成证书
  8. [addons] 安装coredns和kube-proxy

执行结果:

[init] Using Kubernetes version: v1.20.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 SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03
[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] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master] and IPs [10.96.0.1 192.168.16.70]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost master] and IPs [192.168.16.70 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost master] and IPs [192.168.16.70 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[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 20.503656 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.20" 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 master as control-plane by adding the labels "node-role.kubernetes.io/master=''" and "node-role.kubernetes.io/control-plane='' (deprecated)"
[mark-control-plane] Marking the node master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: ey7rw9.05sprzte1a3rx0gn
[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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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.16.70:6443 --token ey7rw9.05sprzte1a3rx0gn \
    --discovery-token-ca-cert-hash sha256:99c6172a87c354ed34c4651c7d322e2a787eae9f0d03cfd26953d330fb03489e 

初始化完成后,我们需要保存kubeadm join的输出值,Node节点加入集群需要用到此命令。
kubeadm join 192.168.16.70:6443 --token ey7rw9.05sprzte1a3rx0gn
–discovery-token-ca-cert-hash sha256:99c6172a87c354ed34c4651c7d322e2a787eae9f0d03cfd26953d330fb03489e


4.2 创建kubectl连接认证文件

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get node		#查看工作节点状态

###Master状态为NotReady是因为我们还没有部署网络插件(CNI),我们先把Node节点加入到集群中先。
在这里插入图片描述


五、Node节点加入集群

###以下操作均需在所有节点服务器上执行
执行在kubeadm init输出的kubeadm join命令:

[root@node1 ~]# kubeadm join 192.168.16.70:6443 --token ey7rw9.05sprzte1a3rx0gn \
  --discovery-token-ca-cert-hash sha256:99c6172a87c354ed34c4651c7d322e2a787eae9f0d03cfd26953d330fb03489e 
--token:集群master token
--discovery-token-ca-cert-hash:验证根 CA 公钥是否与此哈希匹配
更多join参数可查看官方文档:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/#join-workflow

join加入流程(工作节点):
kubeadm 从 API 服务器下载必要的集群信息。默认情况下,它使用引导令牌和 CA 密钥哈希来验证该数据的真实性。也可以通过文件或 URL 直接发现根 CA。
一旦知道集群信息,kubelet 就可以启动 TLS 引导过程。
TLS 引导程序使用共享令牌临时向 Kubernetes API 服务器进行身份验证以提交 证书签名请求 (CSR);默认情况下,控制平面会自动签署此 CSR 请求。
最后,kubeadm 配置本地 kubelet 以使用分配给节点的明确身份连接到 API 服务器。

node1节点执行kubeadm join命令成功
在这里插入图片描述

node2节点执行kubeadm join命令成功
在这里插入图片描述

需要注意的是,kubeadm生成的token默认只有24小时的有效期,如果这期间token失效了,可以使用:kubeadm token create --print-join-command。重新生成token。你也可以使用:kubeadm token list查看token有效期。
在这里插入图片描述

Master节点执行kubectl get node查看:
[root@master ~]# kubectl get node
在这里插入图片描述


六、部署容器网络(CNI)

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

6.1 下载YAML文件

[root@master ~]# wget https://docs.projectcalico.org/manifests/calico.yaml

6.2 定义Pod网络

[root@master ~]# vim calico.yaml
修改CALICO_IPV4POOL_CIDR的值,对应kubeadm init时--pod-network-cidr参数设置的保持一致
# - name: CALICO_IPV4POOL_CIDR	修改为 - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"		修改为   value: "10.244.0.0/16"

在这里插入图片描述

修改时注意缩进,这是yaml文件,必须严格缩进


6.3 部署Calico

[root@master ~]# kubectl apply -f calico.yaml	#基于yaml文件,将新的配置应用到资源上

在这里插入图片描述

[root@master ~]# kubectl get pods -n kube-system #查看kube-system命名空间下的资源信息
主要关注calico四个容器的状态,都为running的话,我们再使用kubectl get node查看节点状态
在这里插入图片描述

[root@master ~]# kubectl get node
在这里插入图片描述

目前集群三个节点状态都为Ready。集群部署完成后,后续的操作基本所有操作都在Master上执行了。


七、测试K8S集群

7.1 创建一个名为 nginx-web 的容器并启动。

[root@master ~]# kubectl create deployment nginx-web --image=nginx
[root@master ~]# kubectl expose deployment nginx-web --port=80 --type=NodePort	#为 nginx 部署创建一个服务,容器端口为80,节点主机端口随机
[root@master ~]# kubectl get pod,svc	#查看pod与server资源信息

在这里插入图片描述

[root@master ~]# kubectl get pod,svc -o wide #查看pod与service详细信息
在这里插入图片描述浏览器测试访问:http://NodeIP/30475
在这里插入图片描述


八、部署 Dashboard

Dashboard是官方提供的一个UI,可用于基本管理K8s资源

8.1 部署Dashboard

[root@master ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml	#下载Dashboard yaml文件

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部

[root@master ~]# vim recommended.yaml
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30443
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort

新增nodePort: 4433与type: NodePort,注意缩进。nodePort的端口值是有范围的:30000-32767

在这里插入图片描述

[root@master ~]# kubectl apply -f recommended.yaml #基于yaml文件,创建资源
在这里插入图片描述

[root@master ~]# kubectl get pods -n kubernetes-dashboard -o wide #查看kubernetes-dashboard命名空间下pod的相关信息。
在这里插入图片描述

可以看出kubernetes-dashboard是运行在node1工作节点上的。
浏览器访问:https://NodeIP:30443/
在这里插入图片描述


8.2 管理员绑定

[root@master ~]# kubectl create serviceaccount dashboard-admin -n kube-system	#创建用户
[root@master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin		#用户授权
[root@master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')	#获取用户token

在这里插入图片描述

使用输出的token登录Dashboard
在这里插入图片描述

在这里插入图片描述

可以在web界面查看K8S上工作节点的资源负载情况,deployment控制器,server,pods等信息。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
感谢您的提问。以下是CentOS 7.9使用kubeadm安装Kubernetes 1.27.1的详细步骤: 1. 在所有节点上升级操作系统 ``` sudo yum upgrade -y ``` 2. 配置防火墙规则 按照Kubernetes官网的要求,关闭防火墙或者开放必需的端口。以下是关闭防火墙的方法: ``` sudo systemctl stop firewalld sudo systemctl disable firewalld ``` 3. 添加Kubernetes仓库 在所有节点上安装必需的工具: ``` sudo yum install -y yum-utils device-mapper-persistent-data lvm2 ``` 然后添加Kubernetes仓库: ``` sudo yum-config-manager --add-repo https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ ``` 4. 安装Docker和Kubernetes 在所有节点上安装Docker和Kubernetes: ``` sudo yum install -y kubelet kubeadm kubectl docker-ce docker-ce-cli containerd.io ``` 配置Docker Cgroup Driver为systemd: ``` sudo mkdir /etc/docker/ sudo tee /etc/docker/daemon.json <<-'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://mirror.ccs.tencentyun.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker ``` 5. 初始化Master节点 在Master节点上执行以下命令初始化: ``` sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ``` 其中--pod-network-cidr参数是指定Pod网络的CIDR地址。 命令完成后,将提示您保存Kubernetes集群加入命令。 执行以下命令以配置kubectl: ``` mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 6. 安装Pod网络插件 在Master节点上执行以下命令以安装Flannel网络插件: ``` kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 7. 加入Node节点 将节点加入集群的命令已输出在初始化Master节点的命令中。 在每个Node节点上,执行相应的命令即可加入集群。 8. 验证集群状态 在Master节点上执行以下命令以验证集群状态: ``` kubectl get nodes ``` 如果所有节点都处于Ready状态,则表示集群已经正常工作。 以上就是CentOS 7.9使用kubeadm安装Kubernetes 1.27.1的详细步骤。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值