一、K8S 发生的布景

1. 运用程序布置方法演化

1.1 传统布置

  传统化布置方法是将运用程序直接布置在物理机上,关于一个java运用程序,运维人员在物理机上建立好开发环境,就能够直接布置。

  该方法对运维人员来说简略易操作,但是会导致资源利用率不高,甚至有的公司为降低本钱会在单台物理机布置多个运用,导致体系安稳性不高,运用之间会彼此影响。

1.2 虚拟化布置

  虚拟化布置方法是虚拟机年代的产物,简略了解便是在单台物理机上布置多个虚拟机,然后在每个虚拟机中布置运用程序。

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

  相比传统布置方法,在资源利用上愈加高效,硬件本钱更低。

1.3 容器化布置

  容器化布置简略了解便是将代码和运用程序运转所需环境一起打包,把它们阻隔在自己的容器中运转。容器化布置跟着 Docker 鼓起而发生,在资源利用上愈加高效、布置愈加灵活性、交给速度更快。

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

2. 容器化布置的困境

  跟着容器化布置的鼓起,在集群环境下如何快速的进行布置???

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

为了解决这个问题,容器编列东西横空而出。常见的容器编列东西有:

  • Docker-Compose:它是单机容器编列东西,很明显不适用于集群环境下的容器办理
  • Docker Swarm:它是 Docker 官方供给的集群容器编列东西
  • Kubernetes:它是 Google 开源的容器编列东西

二、K8S 的基本概念

1. K8S 是什么

Kubernetes 是一款容器的编列调度东西,来源于 Google 开源的 Brog 体系。Kubernetes简称K8S,是用8替代8个字符 “ubernete” 而成的缩写,用于办理云平台中多个主机上的容器化的运用,Kubernetes 的目标是让布置容器化的运用简略而且高效,Kubernetes供给了运用布置,规划,更新,维护的一种机制。

2. K8S 基本概念

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

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

(1)Kubernetes Master

Kubernetes 主节点,是一台物理机,办理K8S集群节点,办理运用程序布置、创立等智能

(2)Node

(3)Pod

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

  • Pod 中容器布置方式

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

Pod 中布置多个容器,比方 tomcat + mysql + 运用程序,这样就构成了一个完好的服务;

Pod 中只布置一个容器,比方布置 tomcat 容器,然后由多个 Pod 对外供给一个完好的服务

  • Pod 中的 Pause 容器

  每个 Pod 中必须有一个 Pause 容器,主要作用是:供给一个同享的网络空间,便利 Pod 内容器间通讯;供给一个 volumes 同享的挂载数据卷,统一办理容器数据

  每个 Pod 之间是彼此阻隔,无法通讯的

(4) Service

它的主要作用便是让多个不同主机上的 Pod 能够彼此通讯

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

(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 节点

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

  • 检查每个虚拟机的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 每台虚拟机装置 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

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

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.3 每台虚拟机装置 kubeadm kubelet kubectl

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

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

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

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

# 装置指令
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 

注释该文件中的最终一行代码

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

(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.4 虚拟机 master 节点初始化

  • kubeadm init 初始化装备选项: kubernetes.io/zh-cn/docs/…

  • Google Container Registry 国内地址:

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

(1)检查所需求的容器

kubeadm config images list

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

(2)镜像地址修正

由于国内无法直接拜访 Google 镜像地址,所以需求切换到阿里云镜像地址履行如下指令:

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 检查下载下来的镜像
docker images

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

(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

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

(4)履行初始化指令

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

履行成果如下所示,每个人履行的成果不相同,所以依据自己的履行成果履行相关指令:

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

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

第5节 K8S介绍和集群环境搭建
此刻发现节点的状况是:NotReady,阐明节点未正常履行

kubectl get pod --all-namespaces: 将k8s本身创立的pod显示出来,能够看到发动状况

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

Running :表明正常运转状况
CrashLoopBackOff :表明创立失败,然后在后台一直重试创立,直到创立成功。一般 kube-controller-manager-master创立很耗时,会推迟履行,所以会有这个状况
Pending :表明等待状况,原因是 coredns 短少网络插件 flannel ,所以需求布置 flannel

  • 装置布置 flannel 装置时需求 kube-flannel.yml 文件,不同版别 Kubernetes 装备文件格式有稍微的区别,kube-flannel.yml 官方关于版别阐明:github.com/flannel-io/…

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

由于我装置的是 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

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

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

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

3.5 虚拟机 node 节点服务器履行

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

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

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

第5节 K8S介绍和集群环境搭建
然后发现 node 节点的状况都是 NotReady ,这个不太正常,此刻应该去检查 node 节点的日志:

journalctl -f -u kubelet

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

然后发现有一个 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 节点检查各个节点状况:

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

至此,根据 MacOS + Parallels Desktop + Centos7 的 K8S集群环境建立完结,欢迎纠正!!!

四、写在最终

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

  • k8s 集群布置问题整理

  • kubernetes装置实战->安稳版别v1.14.3

  • 假如忘记了 node 节点的履行指令 kubeadm join 怎么办??

# 在master节点上检查token
kubeadm token list 

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

然后在 master 上履行指令即可参加集群

kubeadm join 10.211.55.4:6443 --token 7x98z5.e56h321inwvvey58 --discovery-token-unsafe-skip-ca-verification