Kubernetes组件介绍及环境搭建

k8s目前市面上主流的多机多容器编排技术,实现服务的动态扩缩容。

一、k8s主要组件介绍

1、资源类组件
在这里插入图片描述
2、命令执行类组件
在这里插入图片描述

二、k8s集群搭建

k8s官网搭建网址 主要介绍了kind、minikube、kubeadm三方搭建方式。
本文采用kubeadm的方式搭建k8s集群,采用一主两从的模式,共需三台机器。
kubeadm官网链接

版本信息(版本不匹配可能会安装不上):
docker:20.10.7

kubeadm-1.19.0-0
kubelet-1.19.0-0
kubectl-1.19.0-0
下面7个组件的版本会根据安装的kubeadm版本的不同而不同,我这里使用的kubeadm是1.19.0-0版本所以是以下7个版本
k8s.gcr.io/kube-apiserver:v1.19.0
k8s.gcr.io/kube-controller-manager:v1.19.0
k8s.gcr.io/kube-scheduler:v1.19.0
k8s.gcr.io/kube-proxy:v1.19.0
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.9-1
k8s.gcr.io/coredns:1.7.0

calico:v3.9 做k8s集群间网络通信
注意:以下操作除单独说明master和worker节点设置之外,其他的设置master和worker节点一样即master和worker节点都需要设置。

1、准备集群环境需要的机器

准备三台centos机器,且三台机器之间可相互通信。
机器配置要求:
内存:2G及以上
CPU:2核及以上
防火墙关闭或需要将k8s交互所需端口都放开:

systemctl stop firewalld && systemctl disable firewalld  #关闭防火墙并关闭防火墙开机自启

2、更新yum源

原因是老版本的yum源可能一些组件没有

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

这一步可能耗时会久一些,耐心等待即可。

3、安装Docker

centOS安装docker

4、修改hosts文件

a、master节点

sudo hostnamectl set-hostname master  #修改master节点hostname

修改master节点hosts文件

vi /etc/hosts

master节点ip master
worker1节点ip worker1
worker2节点ip worker2

b、两个worker节点

sudo hostnamectl set-hostname worker1  #修改worker1节点hostname
sudo hostnamectl set-hostname worker2  #修改worker2节点hostname

修改worker1、worker2节点hosts文件

vi /etc/hosts

master节点ip master
worker1节点ip worker1
worker2节点ip worker2

设置好之后,在机器中分别ping另外两台机器的hostname,测试是否能够通信;如:master节点中测试:ping worker1和ping worker2。

5、系统设置

a、关闭selinux

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

b、关闭swap

swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

c、配置iptables的ACCEPT规则

iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

d、设置系统参数

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

6、设置k8s yum源

原因在于k8s的相关组件,如kubectl、kubelet,以及安装k8s所需的kubeadm默认会从国外谷歌云拉取,可能会很慢或者拉取不成功。

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

7、安装kubeadm&kubelet&kubectl

yum install -y kubeadm-版本号 kubelet-版本号 kubectl-版本号

我这里使用的是1.19.0-0的版本:

yum install -y kubeadm-1.19.0-0 kubelet-1.19.0-0 kubectl-1.19.0-0

某些版本安装不成功会报错如下:
在这里插入图片描述
如果报错可以查看kubeadm有哪些可安装的版本(同样kubectl、kubelet也有对应的版本):

yum list kubeadm --showduplicates | sort -r

然后试试其他的版本是否可以安装成功。

8、docker和k8s设置同一个cgroup

docker设置:

vi /etc/docker/daemon.json  #编辑daemon文件
"exec-opts": ["native.cgroupdriver=systemd"]  #加入这行配置

如果在daemon中加入"exec-opts": [“native.cgroupdriver=systemd”]配置,后面还有配置的话需要加 ,
在这里插入图片描述
后面没有配置无需加 ,
在这里插入图片描述
重启docker

systemctl restart docker  #重启docker方可生效    

k8s设置:

sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

如果提示文件或目录不存在是正常的。
在这里插入图片描述
重启kubelet

systemctl enable kubelet && systemctl start kubelet  #将kubectl加入开机自启并启动

这一步不设置后面第10步,执行master节点初始化会失败,报错如下:
在这里插入图片描述
提示的解决方案推荐 cgroup 使用 systemd ,可参照该网址设置:
https://kubernetes.io/docs/setup/cri/

9、下载kubeadm搭建集群需要的组件的image

这些组件包含比如kube-api-server、kube-controller-manager、etcd等等,总共7个组件
查看kubeadm需要下载哪些组件image:

kubeadm config images list

所需组件都是这7个,但是根据刚刚安装的kubeadm的版本不同,所需要的这7个组件的版本也不一样
在这里插入图片描述
此时,可以看到所需的7个组件都位于k8s.gcr.io仓库中,在没有科学上网的情况下,这7个组件是无法使用docker pull拉取成功的,所以Linux可以科学上网的情况下直接docker pull拉取就行了。
接下来拉取这7个组件的镜像,不能科学上网解决方案如下:
国内阿里云有一个谷歌的容器镜像仓库,可以从这个仓库中拉取这些组件:
registry.cn-hangzhou.aliyuncs.com/google_containers
拉取的image名称就是将上面看到的k8s.gcr.io换成registry.cn-hangzhou.aliyuncs.com/google_containers即可,拉取完毕之后还需要使用docker tag命令将对应的组件标记一份名称为k8s.gcr.io开头,然后就可以将阿里云拉取的image删除。
比如拉取 k8s.gcr.io/kube-apiserver:v1.19.0 镜像命令如下:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.0 #拉取镜像
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.0 k8s.gcr.io/kube-apiserver:v1.19.0 #将阿里云拉取的image标记为kubeadm需要的组件名称即k8s.gcr.io开头的名称
docker rmi -f registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.0 #将阿里云拉取的image删除

按照上面的方式每个组件都来一次,总共七次就可完毕。
为了方便可以将这个过程写成shell脚本执行。

vi kubeadm.sh  #创建shell文件

编写shell文件,如果安装的kubeadm不是1.19.0-0版本,修改下所需版本号

#!/bin/bash

set -e

KUBE_VERSION=v1.19.0
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.9-1
CORE_DNS_VERSION=1.7.0

GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers

images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})

for imageName in ${images[@]} ; do
  docker pull $ALIYUN_URL/$imageName
  docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
  docker rmi $ALIYUN_URL/$imageName
done

执行shell脚本,直接使用./kubeadm.sh可能会提示权限不够

sh ./kubeadm.sh

等待拉取image完毕。
查看所需7个image三台机器是否都拉取完毕

docker images

注意:如果这里拉取的7个组件的版本和 kubeadm config images list 查看的需要的版本不匹配会导致第10步初始化master节点不成功。

10、初始化master节点-本小节只在master中执行

master节点:

kubeadm init --kubernetes-version=版本号 --apiserver-advertise-address=master节点ip --pod-network-cidr=pod网段信息

如:我这里k8s使用的1.19.0版本,后面的参数都是可选参数,可以直接使用kubeadm init

kubeadm init --kubernetes-version=1.19.0 --apiserver-advertise-address=192.168.117.128 --pod-network-cidr=10.244.0.0/16

在这里插入图片描述
结尾输出以下信息表示主节点初始化成功
在这里插入图片描述

即以下命令

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

执行这三句命令
在这里插入图片描述
worker节点加入集群的命令(先不执行,但保存好后面第12步需要用)

kubeadm join 192.168.117.128:6443 --token tdhn0d.4izxf7blxef97osl \
    --discovery-token-ca-cert-hash sha256:5bc89e247ad5a96801987cf2dc10688d4741fb265b0cc43ab98d3779b3973466

此时看一下,k8s需要的组件是否全部启动成功(这些组件以pod的形式运行的)

kubectl get pods -n kube-system  #其中kube-system是指系统的namespace

可以看到关于dns的两个pod未执行,也就是说k8s的集群网络未启动,类似于docker swarm需要overlay网络进行跨机通信一样
在这里插入图片描述

11、安装网络插件-本小节只在master中执行

k8s支持的网络插件
这里选用calico作为k8s网络插件
在k8s中安装calico插件官网链接
master节点:
可以直接执行下面的命令进行创建pod
kubectl apply -f yml文件 是k8s中运行pod的命令

kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

也可以先将calico.yaml文件中使用的image拉取下来,节约kubectl apply的时间也防止因为拉取image失败导致apply失败。
在这里插入图片描述
即需要下面几个image

docker pull calico/pod2daemon-flexvol:v3.9.6
docker pull calico/node:v3.9.6
docker pull calico/kube-controllers:v3.9.6
docker pull calico/cni:v3.9.6

下载完calico.yaml文件需要的几个image之后,再执行上面的kubectl apply创建pod。
在这里插入图片描述
创建成功后,需要等待一会儿,再次查看 kubectl get pods -n kube-system 可以发现需要的pod都已经成功运行。
在这里插入图片描述

12、将worker节点加入到集群中-本小节只在两个worker中执行

两个worker节点都执行(即上面第10步保存的命令):

kubeadm join 192.168.117.128:6443 --token tdhn0d.4izxf7blxef97osl \
    --discovery-token-ca-cert-hash sha256:5bc89e247ad5a96801987cf2dc10688d4741fb265b0cc43ab98d3779b3973466

在这里插入图片描述

13、查看k8s集群是否搭建成功

两个worker节点执行join完毕之后,在master节点中查看集群节点信息

kubectl get nodes

在这里插入图片描述
worker节点也是Ready状态即成功,如果是NotReady状态,稍等再次查看,正常情况worker节点就会变为Ready状态。

查看集群需要的基础pod是否都成功运行

kubectl get pods -n kube-system  #查看kube-system命名空间下的pod运行情况
kubectl get pods -n kube-system -o wide  #查看kube-system命名空间下的pod运行情况(包含ip、节点等信息)

如果出现worker节点的calico-node是PodInitializing状态,可以等下再查看,正常情况下就会是Running状态。
在这里插入图片描述
到此如果两个worker节点是Ready状态并且kube-system命名空间下的pod都是Running状态,说明k8s通过kubeadm搭建一主两从的集群模式成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值