第5节 K8S介绍和集群环境搭建

一、K8S 产生的背景

1. 应用程序部署方式演变

1.1 传统部署

  传统化部署方式是将应用程序直接部署在物理机上,对于一个java应用程序,运维人员在物理机上搭建好开发环境,就可以直接部署。

  该方式对运维人员来说简单易操作,但是会导致资源利用率不高,甚至有的公司为降低成本会在单台物理机部署多个应用,导致系统稳定性不高,应用之间会相互影响。

1.2 虚拟化部署

  虚拟化部署方式是虚拟机时代的产物,简单理解就是在单台物理机上部署多个虚拟机,然后在每个虚拟机中部署应用程序。

k8s-vm.drawio.png

  相比传统部署方式,在资源利用上更加高效,硬件成本更低。

1.3 容器化部署

  容器化部署简单理解就是将代码和应用程序运行所需环境一起打包,把它们隔离在自己的容器中运行。容器化部署随着 Docker 兴起而产生,在资源利用上更加高效、部署更加灵活性、交付速度更快。

k8s-容器.drawio.png

2. 容器化部署的困境

  随着容器化部署的兴起,在集群环境下如何快速的进行部署???

k8s-集群容器.drawio.png

为了解决这个问题,容器编排工具横空而出。常见的容器编排工具有:

  • Docker-Compose:它是单机容器编排工具,很明显不适用于集群环境下的容器管理
  • Docker Swarm:它是 Docker 官方提供的集群容器编排工具
  • Kubernetes:它是 Google 开源的容器编排工具

二、K8S 的基本概念

1. K8S 是什么

Kubernetes 是一款容器的编排调度工具,来源于 Google 开源的 Brog 系统。Kubernetes简称K8S,是用8代替8个字符 “ubernete” 而成的缩写,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。

2. K8S 基本概念

如下图所示,由3台物理机构成的集群架构图
图片1.png

(1)Kubernetes Master

Kubernetes 主节点,是一台物理机,管理K8S集群节点,管理应用程序部署、创建等智能

(2)Node

(3)Pod

它是K8S最小可部署单元,一个Pod就是一个独立进程;Pod内部容器网络互通,每个Pod都有独立虚拟IP,虚拟IP由K8S管理

  • Pod 中容器部署形式

k8s-Pod.drawio.png

Pod 中部署多个容器,比如 tomcat + mysql + 应用程序,这样就构成了一个完整的服务;

Pod 中只部署一个容器,比如部署 tomcat 容器,然后由多个 Pod 对外提供一个完整的服务

  • Pod 中的 Pause 容器

  每个 Pod 中必须有一个 Pause 容器,主要作用是:提供一个共享的网络空间,方便 Pod 内容器间通信;提供一个 volumes 共享的挂载数据卷,统一管理容器数据

  每个 Pod 之间是相互隔离,无法通信的

(4) Service

它的主要作用就是让多个不同主机上的 Pod 能够相互通信

image.png

(5) Contanier

容器,可以理解为一个个应用程序

(6) Label

它是一个说明性标签,Label 相当于是每一个 Pod 的别名,后期容器部署时都是根据 Label 找到 Pod

(7) Replication Controller

Replication Controller 在主节点上,它能够对 Pod 进行监控,比如当某个 Pod 掉线,Replication Controller可以直接将其剔除,后期如果需要 Pod,也会自动创建

三、K8S 环境准备

  • 使用 kubeadmin 离线镜像安装,推荐使用该种方式安装
  • 通过 yum 官方仓库安装,一般可配置阿里镜像源
  • 使用第三方二进制包形式安装,比如:kubease

1. Parallels Desktop18 中安装 Centos7

本文所有安装步骤都是基于 MacOS + Parallels Desktop + Centos7,并且电脑是 Mac M1 芯片,所以和网上大部分博客内容不太一样,所需要的安装包也不太一样

  • 百度云盘下载镜像链接:pan.baidu.com/s/1Sk8q9G15… ,提取码:yyds

  • 安装流程参考博客:blog.csdn.net/w1871331217…非常给力,能安装成功!!!

  • 安装完成后效果
    设置了3个节点,k8s-master、k8s-node1 和 k8s-node2 节点
    image.png

  • 查看每个虚拟机的IP

k8s-master 节点 :10.211.55.4
k8s-node1 节点 :10.211.55.5
k8s-node2 节点 :10.211.55.6

2. 设置虚拟机环境

  • (1)设置时区和主机名称。每台虚拟机都设置
timedatectl set-timezone Asia/Shanghai 









hostnamectl set-hostname master 
hostnamectl set-hostname node1
hostnamectl set-hostname node2

(2)hosts网络主机配置,方便通过主机名进行通信。每台虚拟机都设置

vim /etc/hosts









# 这里master就是第(1)步骤中 set-hostname master 的主机名
10.211.55.4 master
10.211.55.5 node1
10.211.55.6 node2

解决centos报错-bash: vim: command not found
配置完成后,一定要通过 ping 命令来检测配置是否正确。

(3)关闭防火墙,三台虚拟机都需要设置,生产环境不需要设置

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config









setenforce 0
systemctl disable firewalld
systemctl stop firewalld

3. 安装 K8S

K8S官方安装文档参考:kubernetes.io/zh-cn/docs/…

3.1 使用 iTerm2 终端登录虚拟机

ssh root@10.211.55.4
ssh root@10.211.55.5
ssh root@10.211.55.6

3.2 上传安装包到每个虚拟机中

(1)每个虚拟机上执行命令

mkdir /usr/local/k8s-install

(2)用 scp 命令执行上传

在 iTerm2 中打开一个本地终端窗口,进入到本地准备好的安装包目录,然后依次执行如下命令:

scp -r kubernetes-1.14  root@10.211.55.4:/usr/local/k8s-install
scp -r kubernetes-1.14  root@10.211.55.5:/usr/local/k8s-install
scp -r kubernetes-1.14  root@10.211.55.6:/usr/local/k8s-install

3.3 每台虚拟机安装 Docker

# 安装前执行卸载命令
yum remove docker-ce



# 安装工具
yum install -y yum-utils device-mapper-persistent-data lvm2




# 设置阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo



# 只看稳定版本的 docker
yum-config-manager --disable docker-ce-edge
yum-config-manager --disable docker-ce-test

# 更新 yum 换成
yum makecache fast

# 查看可以用的 docker 版本
yum list docker-ce --showduplicates | sort -r

# 选择指定版本进行安装
yum -y install docker-ce-18.09.9-3.el7

# 启动 docker
systemctl start docker

# 设置成开启启动
systemctl enable docker

image.png

docker info | grep cgroup 

如果不是groupfs,执行下列语句

cat << EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}
EOF




systemctl daemon-reload && systemctl restart docker

配置 Docker 国内镜像地址:

vim /etc/docker/daemon.json









# 文件中添加如下配置:
{


  "registry-mirrors": ["https://896977yg.mirror.aliyuncs.com","http://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"]

}



# 刷新配置
systemctl daemon-reload



# 重启docker
systemctl restart docker

3.4 每台虚拟机安装 kubeadm kubelet kubectl

安装之前要确认 K8S 支持 Docker 引擎的版本,如何查看?查看每个版本的 kubernetes 的dependencies.yaml 文件,看其中依赖的 Docker 版本即可
github.com/kubernetes/…

image.png

kubeadm 是K8S集群快速构建工具

kubelet 是运行在所有节点上,负责启动Pod和容器,以系统服务形式出现

kubectl 是kubenetes命令行工具,提供指令,类似Shell命令

(1)添加阿里云 aarch64yum

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
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
#清除缓存
yum clean all



#把服务器的包信息下载到本地电脑缓存起来,makecache建立一个缓存
yum makecache




#列出kubectl可用的版本
yum list kubectl --showduplicates | sort -r

(2)执行安装命令

因为我的 Docker 安装的是 18.09.9 版本,依赖这个版本的最高 K8S 版本是 1.16.15

image.png

# 安装命令
yum install -y kubelet-1.16.15 kubeadm-1.16.15 kubectl-1.16.15



#查看kubelet版本
kubelet --version
 
#查看kubeadm版本
kubeadm version



# 查看 kubectl 版本
kubectl version

(3)关闭交换区

swapoff -a
vim /etc/fstab 

注释该文件中的最后一行代码
image.png

(4)配置网桥

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


sysctl --system

(5)启动 kubelet

systemctl enable kubelet && systemctl start kubelet

3.5 初始化虚拟机 master 主服务器节点

registry.cn-hangzhou.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers

(1)查看所需要的容器

kubeadm config images list

image.png

(2)镜像地址修改

因为国内无法直接访问 Google 镜像地址,所以需要切换到阿里云镜像地址执行如下命令:

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers









# 查看下载下来的镜像
docker images

image.png

(3)对镜像进行重命名

docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.16.15      k8s.gcr.io/kube-proxy:v1.16.15









docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.16.15  k8s.gcr.io/kube-apiserver:v1.16.15



docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.16.15   k8s.gcr.io/kube-controller-manager:v1.16.15




docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.16.15    k8s.gcr.io/kube-scheduler:v1.16.15


docker tag registry.aliyuncs.com/google_containers/etcd:3.3.15-0    k8s.gcr.io/etcd:3.3.15-0

docker tag registry.aliyuncs.com/google_containers/coredns:1.6.2    k8s.gcr.io/coredns:1.6.2



docker tag registry.aliyuncs.com/google_containers/pause:3.1   k8s.gcr.io/pause:3.1

image.png

(4)执行初始化命令

kubeadm init --kubernetes-version=v1.16.15 --pod-network-cidr=10.244.0.0/16

执行结果如下所示,每个人执行的结果不一样,所以根据自己的执行结果执行相关命令:

image.png

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.211.55.4:6443 --token 7x98z5.e56h321inwvvey58 \
    --discovery-token-ca-cert-hash sha256:24ce986ab173e387d3f07caf78a18f73c50d563d2827ddf440e44f6ac9672591

注意对于结果中 kubeadm join 命令不要在 master 节点上执行,它是用来在非 master 节点上执行的!!!

  • 查看K8S
kubectl get nodes

image.png
此时发现节点的状态是:NotReady,说明节点未正常执行

kubectl get pod --all-namespaces: 将k8s本身创建的pod显示出来,可以看到启动状态

image.png

Running :表示正常运行状态
CrashLoopBackOff :表示创建失败,然后在后台一直重试创建,直到创建成功。一般 kube-controller-manager-master创建很耗时,会延迟执行,所以会有这个状态
Pending :表示等待状态,原因是 coredns 缺少网络插件 flannel ,所以需要部署 flannel

  • 安装部署 flannel
    安装时需要 kube-flannel.yml 文件,不同版本 Kubernetes 配置文件格式有稍微的区别,kube-flannel.yml 官方关于版本说明:github.com/flannel-io/…

image.png

因为我安装的是 Kubernetes v1.16 的版本,所以下载 kube-flannel-psp.yml 文件到你本地,然后执行 scp 命令上传到你的虚拟机上:

scp -r kube-flannel.yml  root@10.211.55.4:/usr/local/k8s-install









kubectl  apply -f kube-flannel.yml

image.png

kubectl get pod --all-namespaces 查询一下最新pod 最新状态

image.png

3.6 虚拟机从节点服务器执行

kubeadm join 10.211.55.4:6443 --token 7x98z5.e56h321inwvvey58 \
    --discovery-token-ca-cert-hash sha256:24ce986ab173e387d3f07caf78a18f73c50d563d2827ddf440e44f6ac9672591

image.png

然后去主节点查看集群记节点状态:
kubectl get node -o wide

image.png
然后发现 node 节点的状态都是 NotReady ,这个不太正常,此时应该去查看 node 节点的日志:

journalctl -f -u kubelet

image.png

然后发现有一个 network plugin is not ready: cni config uninitialized 信息,解决方法,每个k8s节点执行如下命令:

vim /var/lib/kubelet/kubeadm-flags.env

#KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1"









KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs  --pod-infra-container-image=k8s.gcr.io/pause:3.1"



systemctl daemon-reload
systemctl restart kubelet

再去 master 节点查看各个节点状态:

image.png

至此,基于 MacOS + Parallels Desktop + Centos7 的 K8S集群环境搭建完成,欢迎指正!!!

四、写在最后

k8s常见问题,可参考博文:

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYZ0tPHu' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片