什么是 Kubernetes
Kubernetes 官方解释:
Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
通俗些讲,可以将 Kubernetes
看作是用来是一个部署镜像的平台。可以用来操作多台机器调度部署镜像,大大地降低了运维成本。
那么, Kubernetes
和 Docker
的关系又是怎样的呢?
一个形象的比喻:如果你将 docker
看作是飞机,那么 kubernetes
就是飞机场。在飞机场的加持下,飞机可以根据机场调度选择在合适的时间降落或起飞。
在 Kubernetes
中,可以使用集群来组织服务器的。集群中会存在一个 Master
节点,该节点是 Kubernetes
集群的控制节点,负责调度集群中其他服务器的资源。其他节点被称为 Node
, Node
可以是物理机也可以是虚拟机。
安装之前的要求
在开始部署k8s集群之前,服务器需要满足以下条件:
- 1️⃣至少两台以上的服务器,操作系统需要保持CentOS8.4这个版本。
- 2️⃣服务器配置:Master节点服务器需要至少为2核4GB的配置,Node节点需要至少1核2GB的配置,硬盘至少40GB。
- 3️⃣集群中的所有机器之间网络互通。
- 4️⃣可以访问外网,需要拉取镜像。
- 5️⃣禁止Swap分区。
基础安装
请注意
在基础安装这个部分,Mater 和 Node 节点都需要安装,安装文档的书写顺序执行即可。另外,服务器的系统版本为 CentOS8.4。
基础组件安装
vim
是 Linux
下的一个文件编辑器; wget
可以用作文件下载使用;如果下面的都已经安装,可以跳过。
yum install vim wget -y
修改主机名
hostnamectl set-hostname设置主机名称没有反应的话,只需要重新连接一下即可。
# master节点执行
hostnamectl set-hostname k8smaster
# node1节点执行
hostnamectl set-hostname k8snode1
# 在node2节点执行
hostnamectl set-hostname k8snode2
# 在node3节点执行
hostnamectl set-hostname k8snode3
配置hosts
需要在Master节点和Node节点将他们的主机IP数据都存储到hosts一份。以下的IP仅供参考。
cat >> /etc/hosts << EOF
10.0.0.6 k8smaster
10.0.0.7 k8snode
EOF
使用 ip addr
命令,获取本机 IP,将其添加到 /etc/hosts
内。本机 IP 如下图红色圈中所示。
时间同步
使用
chrony
来统一我们的系统时间和时区,服务器时间与阿里云服务器对齐。检查系统是否已经默认安装 chrony。。注意:在CentOS8.4系统中默认自带chrony,只需要启动即可。
检查是否安装:
rpm -qa |grep chrony
安装 chrony 服务,如果已安装的话请跳转到启动并加入开机自启
这一步。
yum install chrony -y
启动并加入开机自启:
# 启动chrony服务
systemctl start chronyd
# 设置开机自启
systemctl enable chronyd
# 查看chrony服务状态
systemctl status chronyd
配置阿里云的 ntp 服务,修改 /etc/chrony.conf 配置文件,将以下的内容修改到 chrony 的配置文件中,请注意中文注释的地方:
[root@node1 ~]# cat /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# 下面这一行需要注释掉
# pool 2.centos.pool.ntp.org iburst
/**
* 格式为:server 服务器ip地址 iburst
* 添加阿里云的ntp服务器,可以多写几个ntp服务器,防止第一个服务器宕机,备用的其他ntp服务器可以继续进行时间同步
* ip地址为服务器ip地址,iburst代表的是快速同步时间
**/
# 仅需要添加下面三行内容即可
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
重启 chrony 服务使配置生效。
# 重启chrony服务
systemctl restart chronyd
# 查看chrony服务状态
systemctl status chronyd
# 查看时钟源授时时间偏差值
chronyc sources
# 强制同步一次
chronyc -a makestep
关闭防火墙
因为 kubernetes 会创建防火墙规则,导致防火墙规则重复。所以这里我们要将防火墙关闭:
# 停止firewalld服务
systemctl stop firewalld
# 禁止firewalld开机启动
systemctl disable firewalld
关闭 Swap分区
下一步我们需要关闭
Swap
分区。Swap
是Linux
的交换分区,在系统资源不足时,Swap
分区会启用。这操作会拖慢我们的应用性能。应该让新创建的服务自动调度到集群的其他Node
节点中去,而不是使用Swap
分区。关闭方法如下:
# 临时关闭;关闭swap主要是为了性能考虑
swapoff -a
# 可以通过这个命令查看swap是否关闭了
free
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
禁用 SELinux
这是为了支持容器可以访问宿主机文件系统所做的,后续也许会优化掉:
# 临时关闭
setenforce 0
# 永久禁用
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
安装 Docker
请注意
Master 和 Node 节点均需要安装。
由于 Kubernetes 与 Docker 之间存在版本依赖,因此我们需要在此处安装指定版本的 Docker。另外,下面安装 Docker 的命令在 CentOS8.4 系统上执行的时候会多次失败,如有命令失败,请多次重试。
- 安装基本的依赖:
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置 yum 源加速 Docker 的安装:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看可用的版本:
yum list docker-ce --showduplicates | sort -r
查看到的 Docker 可用版本如下所示,红色选中区域的内容即为需要安装的 Docker 版本号。
执行下面的命令安装即可,下面的命令为本次执行需要的版本号,直接复制执行即可:
sudo yum install docker-ce-20.10.15-3.el8 docker-ce-cli-20.10.15-3.el8 containerd.io
安装完毕后,我们使用使用 systemctl
启动 Docker
即可。
# 启动Docker
systemctl start docker
# 开启Docker的开机自启动
systemctl enable docker
执行 docker -v
,如果显示以下 docker
版本的信息,代表 docker
安装成功。
[root@master ~]# docker -v
Docker version 20.10.15, build fd82621
- 接下来,我们还需要修改一下 docker 的
cgroupdriver
为systemd
,这样做是为了避免后面与 k8s 的冲突,下面的内容也是直接复制到控制台执行即可。
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
- 我们拉取
Docker
镜像时,一般默认会去Docker
官方源拉取镜像。但是国内出海网速实在是太慢,所以需要更换镜像源进行镜像下载加速。编辑配置文件,修改镜像源:vi /etc/docker/daemon.json,将下面的内容追加进去。
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://dockerproxy.1panel.live",
"https://docker.1panel.live",
"https://docker.1panelproxy.com",
"https://proxy.1panel.live"
],
// 下面的这一段视情况添加,是我们自己部署的Harbor镜像仓库,没有删除下面的内容即可。
"insecure-registries": ["http://[私有库地址]:[私有库端口]"]
}
修改以后重启:
systemctl daemon-reload
systemctl restart docker
安装 Kubernetes
请注意
- Master 和 Node 节点均需要安装。
- 上面安装的 Docker 版本为 20.10.15,此处安装的 Kubernetes 版本需要与之有对应关系。我们在此处选择的 Kubernetes 版本为 1.23.6。
从这里我们开始安装 Kubernetes
的相关组件,首先先将安装源更换为为国内的阿里云源,直接复制下面的内容到控制台执行即可。
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
接着直接使用 yum
命令安装 kubelet
、 kubeadm
、kubectl
即可,安装完毕后启用 kubelet
即可。
提示
kubelet
是Kubernetes
中的核心组件。它会运行在集群的所有节点上,并负责创建启动服务容器。kubectl
则是 Kubernetes 的命令行工具。可以用来管理,删除,创建资源。kubeadm
则是用来初始化集群,子节点加入的工具。
# 安装kubernetes
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
# 启动kubelet
systemctl enable kubelet
systemctl start kubelet
设置bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
Master 节点单独安装
请注意
Master 节点是集群内的调度和主要节点,以下的内容仅限 Mater 节点才能安装!!!
配置 Kubernetes 初始化文件。接着我们使用 kubeadm config print init-defaults
输出一份默认初始化配置文件,使用 >
操作符即可导出为一份文件,方便我们进行修改。注意:此处默认放在~
目录执行。
kubeadm config print init-defaults > init-kubeadm.conf
vim init-kubeadm.conf
主要对配置文件做这几件事情:
- 更换
Kubernetes
镜像仓库为阿里云镜像仓库,加速组件拉取 - 替换
ip
为自己主机ip
- 配置
pod
网络为flannel
网段
修改下面添加注释的几处注释:
# imageRepository: k8s.gcr.io 更换k8s镜像仓库
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
localAPIEndpoint:
# 此处为master的IP
advertiseAddress: 10.0.0.5
# 默认不需要修改,但是特别需要注意的是,这个端口在主机的安全组中一定要放开,否则在后续的主从机器之间会出现无法访问的问题。
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
# 下面这一行尤其要注意:必须改成之前通过hostnamectl set-hostname设置的主机名称,否则会出现无法生效的问题。
name: k8smaster
taints: null
# 配置子网络
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
# 在serviceSubnet同级层次下添加下面的这行配置,无需问为什么,配置就是如此
podSubnet: 10.244.0.0/16
查看k8s所需镜像
kubeadm config images list
在修改完配置文件后,我们需要使用 kubeadm
拉取我们的默认组件镜像。直接使用 kubeadm config images pull
命令即可,命令的执行目录需要和命令的生成目录保持一致。
kubeadm config images pull --config init-kubeadm.conf
拉取镜像的执行过程如下所示:
[root@k8smaster ~]# kubeadm config images pull --config init-kubeadm.conf
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.1-0
[config/images] Pulled registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6
为了防止在初始化的时候出现tc not found in system path
这样的错误提示,我们需要在此处补充安装一个插件。不安装也不会影响主要的功能和结果
yum install iproute-tc -y
初始化 Kubernetes。在镜像拉取后,我们就可以使用刚才编辑好的配置文件去初始化 Kubernetes
集群了。这里直接使用 kubeadm init
命令去初始化即可。
kubeadm init --config init-kubeadm.conf
在静等运行一会后,终端会给出以下提示,其中红色框中的命令为需要在 Master 节点执行的初始化命令,其作用为将默认的 Kubernetes
认证文件拷贝进 .kube
文件夹内,才能默认使用该配置文件。蓝色框中的命令需要在 Node 节点执行,其作用是可以快速将 Node
节点加入到 Master
集群内,注意 ⚠️:此处只运行红色框内的命令即可。
安装 Flannel。前面我们在配置文件中,有提到过配置Pod子网络
,Flannel
主要的作用就是如此。它的主要作用是通过创建一个虚拟网络,让不同节点下的服务有着全局唯一的 IP 地址,且服务之前可以互相访问和连接。那么 Flannel
作为 Kubernetes
的一个组件,则使用 Kubernetes
部署服务的方式进行安装。首先下载配置文件。下面的命令执行的时候存在比较慢的情况,实践表明停止再试是个不错的办法。
wget https://raw.githubusercontent.com/coreos/flannel/v0.18.1/Documentation/kube-flannel.yml
接着我们手动拉取下 flannel
镜像。
docker pull quay.io/coreos/flannel:v0.13.0-rc2
等待镜像拉取结束后,可以使用 kubectl apply
命令加载下服务。
kubectl apply -f kube-flannel.yml
在大约稍后 1 分钟左右,我们可以使用 kubectl get nodes
命令查看节点的运行状态。如果 STATUS = ready
,则代表启动成功。如下所示:
[root@k8smaster ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready control-plane,master 4h18m v1.23.6
k8snode Ready <none>
Node 节点单独安装
请注意
以下的内容仅限 Node 节点才能安装!!!
- 拷贝 Master 节点配置文件。接着将
master
节点的配置文件拷贝k8s
到node
节点。回到在master
节点,使用scp
命令通过SSH
传送文件:
scp $HOME/.kube/config root@这里为Node节点的IP地址:~/
- 随后在
node
节点执行以下命令,归档配置文件:
mkdir -p $HOME/.kube
sudo mv $HOME/config $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 加入 Master 节点。我们直接使用刚才在
master
生成的节点加入命令,在node
机器上执行。让Node
节点加入到master
集群内:
# 下面的命令是在执行master节点的时候生成的,请不要照抄!!!
kubeadm join 10.0.0.5:6443 --token 90i0t0.nzpbqguxgnkz8rma --discovery-token-ca-cert-hash sha256:68a48020b59bb8bf55155557936963002d9d63aa578b5b87dbfa768ed2402fbb
- 如果刚才的命令丢了,可以在
master
机器上使用kubeadm token create
重新生成一条命令即可:
kubeadm token create --print-join-command
- 安装 Flannel。这里的安装 Flannel 的方式和 Master 安装执行方式一样,不再赘述。
服务部署
到这一步,K8S基础的安装算是完成了,接下来在kubernetes集群中部署一个nginx程序,测试下集群是否正常工作。
# 部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务的状态
kubectl get pods,svc
# 最后在电脑上访问一下部署好的服务