Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811
Kubernetes

基于Kubeadm安装Kubernetes部署方案

1 Kubernetes简介

Kubernetes是一个轻便和可扩展的开源云平台,用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署以及扩容和缩容等操作。在Kubernetes中,可以将组成应用的容器结合成一个逻辑单元,更易于管理和发现。

2 Kubernetes功能

  • 自动装箱

基于容器对应用运行环境的资源配置要求自动部署应用容器。

  • 自我修复

当容器失败时,会对容器进行重启;当所部署的Node节点出现问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器,直到容器正常运行时,才会对外提供服务。

  • 水平扩展

通过简单的命令,对应用容器进行规模扩大或剪裁。

  • 服务发现

用户不需要使用额外的服务发现机制就能够基于Kubernetes自身能力实现服务的发现和负载均衡。

  • 滚动更新

可以根据应用的变化,对应用容器的应用进行一次性或批量更新。

  • 版本回退

可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退。

  • 密钥和配置管理

在不需要重新构建镜像情况下,可以部署和更新密钥以及应用配置。

  • 存储编排

自动实现存储系统挂载及应用,尤其对有状态应用实现数据持久化十分重要。存储系统可以来自本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)、公共云存储等。

3 Kubernetes集群角色

  • Master Node

集群控制节点,对集群进行调度管理,接收集群外用户操作请求,由API Server、Scheduler、Cluster State Store(ETCD数据库)和Controller Server组成。

  • Worker Node

集群工作节点,运行用户业务应用容器,由Kubelet、Kube Proxy和Container Runtime组成。

4 Kubernetes架构

 Kubernetes架构
图4-1 Kubernetes架构

架构说明:

  • Etcd

保存整个集群的状态。

  • API Server

提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。

  • Controller Manager

负责维护集群的状态,如故障检测、自动扩展、滚动更新等。

  • Scheduler

负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。

  • Kubelet

负责维护容器的生命周期、Volume(CVI) 和网络(CNI)的管理。

  • Container Runtime

负责镜像管理以及Pod和容器的真正运行(CRI)。

  • Kube-proxy

负责为Service提供Cluster内部的服务发现和负载均衡(四层)。

5 Kubernetes安装环境

本次部署三个节点,一个master节点,两个worker节点,如表5-1。

节点系统网卡:eth0
master1Centos7.610.0.0.100
worker1Centos7.610.0.0.101
worker2Centos7.610.0.0.102

表5-1:安装环境

配置说明:

master1

  • 内存:16G
  • CPU:双核双线程,虚拟化开启
  • 硬盘:300G

worker1/2

  • 内存:16G
  • CPU:双核双线程,虚拟化开启
  • 硬盘:300G

6 基础环境部署

6.1 修改主机名(所有节点)

  • master节点
hostnamectl set-hostname master1
  • worker1节点
hostnamectl set-hostname worker1
  • worker2节点
hostnamectl set-hostname worker2

6.2 配置域名解析(所有节点)

vi etc/hosts
10.0.0.100 master1
10.0.0.101 worker1
10.0.0.102 worker2

6.3 关闭防火墙与SELINUX(所有节点)

systemctl stop firewalld
systemctl disable firewalld
vi /etc/selinux/config
SELINUX=disabled
reboot

6.4 关闭swap分区(所有节点)

使用Kubeadm部署时必须关闭swap分区,此处采用将swap分区注释掉方式。

vi /etc/fstab
#/dev/mapper/centos-swap swap         swap    defaults         0 0
reboot

6.5 配置时间同步(所有节点)

master节点与worker节点的时间需要同步,否则可能会出现意外问题。

  • master1节点
yum install -y chrony
vi /etc/chrony.conf 
allow 10.0.0.0/24
systemctl enable chronyd.service
systemctl start chronyd.service
  • worker1/worker2节点
yum install -y chrony
vi /etc/chrony.conf 
server 10.0.0.100 iburst
  • 设置开机自启并启动
systemctl enable chronyd.service
systemctl start chronyd.service

6.6 配置优化(所有节点)

  • 添加网桥过滤及地址转发,实现内核的过滤
vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
  • 加载br_netfilter模块
modprobe br_netfilter
  • 加载网桥过滤配置文件
sysctl -p /etc/sysctl.d/k8s.conf
  • 所有节点开启ipvs
sysctl -p /etc/sysctl.d/k8s.conf
  • 安装软件ipset和ipvsadm
yum install -y ipset ipvsadm
  • 添加需要加载的模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
  • 添加权限并应用
chmod 777 /etc/sysconfig/modules/ipvs.modules
sh /etc/sysconfig/modules/ipvs.modules

7 安装docker(所有节点)

7.1 安装docker依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2

7.2 设置阿里镜像源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

7.3 安装指定版本docker

yum -y install docker-ce-20.10.12-3.el7

7.4 设置开机自启并启动

systemctl enable docker
systemctl start docker

7.5 修改配置文件

vi /etc/docker/daemon.json
{
     "exec-opts": ["native.cgroupdriver=systemd"]
}

8 升级系统内核(所有节点)

由于CentOS 7.x 系统自带的3.10.x内核存在一些Bug,导致运行的Docker和Kubernetes不稳定,因此需要将系统内核升级至最新版本,升级步骤如下(如内核已是新版则跳过此步骤)。

  • 安装工具wget和unzip
yum install -y curl wget unzip
  • 导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
  • 安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
  • 安装最新版本内核
yum --enablerepo=elrepo-kernel install kernel-ml
  • 设置新的内核为grub2的默认版本
grub2-set-default 0
  • 生成grub配置文件并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

9 Kubernetes组件安装(所有节点)

Kubernetes组件包含Kubeadm、Kubelet、Kubectl,功能如下。

  • Kubeadm

初始化集群、管理集群等。

  • Kubelet

接收api-server指令,对Pod生命周期进行管理。

  • Kubectl

集群命令行管理工具。

9.1 配置Kubernetes的yum源

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

9.2 安装组件

安装组件Kubeadm,Kubelet和Kubectl并指定版本。

yum makecache fast
yum install -y kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3
systemctl enable kubelet

修改配置文件。

vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

10 初始化集群(master节点)

10.1 master节点初始化

在master节点上的任意路径下输入执行以下命令。

kubeadm init \
  --apiserver-advertise-address=10.0.0.100 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.21.3 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all

参数说明:

  • apiserver-advertise-address

集群通告地址。

  • image-repository

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

  • kubernetes-version

Kubernetes版本,与上面安装的一致。

  • service-cidr

集群内部虚拟网络,Pod统一访问入口。

  • pod-network-cidr

Pod网络,与下面部署的CNI网络组件yaml中保持一致。

正常初始化后,会提示下图10-1中的内容,并将箭头所指处复制到本地。

初始化提示
图10-1 初始化提示

根据提示配置如下内容。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

10.2 镜像准备

查看集群使用的容器镜像。

[root@master1 ~]# kubeadm config images list
I0608 09:54:34.987170    2894 version.go:254] remote version is much newer: v1.24.1; falling back to: stable-1.21
registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.13
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.13
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.13
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.13
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
[root@master1 ~]#

生成脚本。

kubeadm config images list >> image.list

编辑脚本。

vi image.list
#!/bin/bash
img_list='registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.3
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.3
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.3
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.3
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0'
for img in ${img_list}
do
          docker pull $img
done

执行脚本。

sh image.list

10.3 worker节点加入集群

将图10.1所指地方配置到worker1和worker2节点上。

kubeadm join 10.0.0.100:6443 --token wq53fj.x28gsb67wd3josc4 \
  --discovery-token-ca-cert-hash sha256:ecabaf79ece2225a8d52b0febe03001ad512ada9dd8b26926161a85a341ac6f9

master节点查看集群。

kubectl get nodes
节点加入检查
图10-2 节点加入检查

11 部署容器网络

本文档使用Calico部署容器网络,Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案,步骤如下。

  • 下载yaml
wget https://docs.projectcalico.org/manifests/calico.yaml
  • 应用calico.yaml
kubectl apply -f calico.yaml
  • 查看部署进度,全部为running后则正常
[root@master1 ~]# kubectl get pods -n kube-system
NAME                                             READY   STATUS    RESTARTS   AGE
calico-kube-controllers-685b65ddf9-hgjx7   1/1     Running   0          148m
calico-node-8ngrz                               1/1     Running   0          148m
calico-node-p2lc9                               1/1     Running   0          148m
calico-node-r2tkg                               1/1     Running   0          148m
coredns-59d64cd4d4-fqfq9                       1/1     Running   0          163m
coredns-59d64cd4d4-zcph8                       1/1     Running   0          163m
etcd-master1                                     1/1     Running   0          163m
kube-apiserver-master1                         1/1     Running   0          163m
kube-controller-manager-master1              1/1     Running   0          163m
kube-proxy-lszzs                                1/1     Running   0          162m
kube-proxy-pbjhs                                1/1     Running   0          163m
kube-proxy-wjl7x                                1/1     Running   0          162m
kube-scheduler-master1                         1/1     Running   0          163m 
[root@master1 ~]#

12 测试Kubernetes集群

在Kubernetes集群中创建一个Pod,验证是否正常运行。

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

结果如下图12-1。

检查Pod创建
图12-1 检查Pod创建

验证Kubernetes可以保持一定个数容器运行的功能,此处把replicas修改为3如下。

kubectl scale --replicas=3 deployment/nginx
kubectl get pod -o wide
 修改副本数量后Pod查看
图12-2 修改副本数量后Pod查看

尝试删除一个正在运行中的Pod。

kubectl delete pod nginx-6799fc88d8-dcxql
图12-3 删除一个Pod

再次查看Pod数量。

kubectl get pod -o wide
删除一个Pod后查看
图12-4 删除一个Pod后查看

可以看到之前的ip为10.244.235.136的Pod已经被删除,并产生了新的Pod,ip为10.244.235.137,说明Kubernetes功能正常。

检查各ip的连通性。

ping各Pod的ip:10.244.235.141、10.244.235.140、10.244.189.72,如下图12-5、12-6、12-7。

 ping测试1
图12-5 ping测试1
ping测试2
图12-6 ping测试2

 ping测试3
图12-7 ping测试3

curl service的ip:10.107.23.235,如图12-8。

curl svc测试
图12-8 curl svc测试

curl node:ip测试,如图12-9、12-10、12-11。

curl node:port测试1
图12-9 curl node:port测试1

curl node:port测试2
图12-10 curl node:port测试2

 curl node:port测试3
图12-11 curl node:port测试3

Pod与Pod连通性测试,如图12-12。

 Pod与Pod连通性测试
图12-12 Pod与Pod连通性测试

检查DNS解析可用性,如图12-13。

 dns可用性检查
图12-13 dns可用性检查

访问地址:http://<任意node的ip>:port,此处访问:10.0.0.101:31339,结果如图12-14。

 nginx测试访问
图12-14 nginx测试访问

测试结果:无异常。

13 部署Dashboard

Dashboard是官方提供的一个UI,可用于管理Kubernetes资源。

master节点输入如下命令。

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,可以修改recommended.yaml文件中Service类型为nodeport,方便集群外的机器访问。

kind: Service
apiVersion: v1
metadata:
labels:
  k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
  - port: 443
    targetPort: 8443
    nodePort: 30443
selector:
  k8s-app: kubernetes-dashboard
type: NodePort

再次输入如下命令。

kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard

待所有Pod处于running的状态后,创建service account并绑定默认cluster-admin管理员集群角色。

kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

访问地址:https://<任意node的ip>:30443,将上条命令产生的token复制后填入,进行登录,如图13-1,13-2。

登录界面
图13-1 登录界面

登录成功
图13-2 登录成功

至此一个可用的kubernetes集群安装完毕。

更多内容请参考:A-Lab

A-lab-部署验证

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2