一、K8S 发生的布景
1. 运用程序布置方法演化
1.1 传统布置
传统化布置方法是将运用程序直接布置在物理机上,关于一个java运用程序,运维人员在物理机上建立好开发环境,就能够直接布置。
该方法对运维人员来说简略易操作,但是会导致资源利用率不高,甚至有的公司为降低本钱会在单台物理机布置多个运用,导致体系安稳性不高,运用之间会彼此影响。
1.2 虚拟化布置
虚拟化布置方法是虚拟机年代的产物,简略了解便是在单台物理机上布置多个虚拟机,然后在每个虚拟机中布置运用程序。
相比传统布置方法,在资源利用上愈加高效,硬件本钱更低。
1.3 容器化布置
容器化布置简略了解便是将代码和运用程序运转所需环境一起打包,把它们阻隔在自己的容器中运转。容器化布置跟着 Docker 鼓起而发生,在资源利用上愈加高效、布置愈加灵活性、交给速度更快。
2. 容器化布置的困境
跟着容器化布置的鼓起,在集群环境下如何快速的进行布置???
为了解决这个问题,容器编列东西横空而出。常见的容器编列东西有:
-
Docker-Compose
:它是单机容器编列东西,很明显不适用于集群环境下的容器办理 -
Docker Swarm
:它是Docker
官方供给的集群容器编列东西 -
Kubernetes
:它是Google
开源的容器编列东西
二、K8S 的基本概念
1. K8S 是什么
Kubernetes
是一款容器的编列调度东西,来源于 Google
开源的 Brog
体系。Kubernetes
简称K8S
,是用8替代8个字符 “ubernete” 而成的缩写,用于办理云平台中多个主机上的容器化的运用,Kubernetes
的目标是让布置容器化的运用简略而且高效,Kubernetes
供给了运用布置,规划,更新,维护的一种机制。
2. K8S 基本概念
如下图所示,由3台物理机构成的集群架构图
(1)Kubernetes Master
Kubernetes 主节点,是一台物理机,办理K8S集群节点,办理运用程序布置、创立等智能
(2)Node
(3)Pod
它是K8S最小可布置单元,一个Pod便是一个独立进程;Pod内部容器网络互通,每个Pod都有独立虚拟IP,虚拟IP由K8S办理
- Pod 中容器布置方式
Pod 中布置多个容器,比方 tomcat + mysql + 运用程序,这样就构成了一个完好的服务;
Pod 中只布置一个容器,比方布置 tomcat 容器,然后由多个 Pod 对外供给一个完好的服务
- Pod 中的 Pause 容器
每个 Pod 中必须有一个 Pause 容器,主要作用是:供给一个同享的网络空间,便利 Pod 内容器间通讯;供给一个 volumes 同享的挂载数据卷,统一办理容器数据
每个 Pod 之间是彼此阻隔,无法通讯的
(4) Service
它的主要作用便是让多个不同主机上的 Pod 能够彼此通讯
(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 节点
-
检查每个虚拟机的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
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/…
kubeadm 是K8S集群快速构建东西
kubelet 是运转在所有节点上,担任发动Pod和容器,以体系服务方式呈现
kubectl 是kubenetes指令行东西,供给指令,相似Shell指令
(1)添加阿里云 aarch64
的 yum
源
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
# 装置指令
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
注释该文件中的最终一行代码
(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
(2)镜像地址修正
由于国内无法直接拜访 Google 镜像地址,所以需求切换到阿里云镜像地址履行如下指令:
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 检查下载下来的镜像
docker images
(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
(4)履行初始化指令
kubeadm init --kubernetes-version=v1.16.15 --pod-network-cidr=10.244.0.0/16
履行成果如下所示,每个人履行的成果不相同,所以依据自己的履行成果履行相关指令:
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
此刻发现节点的状况是:NotReady,阐明节点未正常履行
kubectl get pod --all-namespaces
: 将k8s本身创立的pod显示出来,能够看到发动状况
Running :表明正常运转状况
CrashLoopBackOff :表明创立失败,然后在后台一直重试创立,直到创立成功。一般 kube-controller-manager-master
创立很耗时,会推迟履行,所以会有这个状况
Pending :表明等待状况,原因是 coredns
短少网络插件 flannel
,所以需求布置 flannel
- 装置布置
flannel
装置时需求kube-flannel.yml
文件,不同版别Kubernetes
装备文件格式有稍微的区别,kube-flannel.yml
官方关于版别阐明:github.com/flannel-io/…
由于我装置的是 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
kubectl get pod --all-namespaces
查询一下最新pod 最新状况
3.5 虚拟机 node 节点服务器履行
kubeadm join 10.211.55.4:6443 --token 7x98z5.e56h321inwvvey58 \
--discovery-token-ca-cert-hash sha256:24ce986ab173e387d3f07caf78a18f73c50d563d2827ddf440e44f6ac9672591
然后去主节点检查集群记节点状况:
kubectl get node -o wide
然后发现 node 节点的状况都是 NotReady ,这个不太正常,此刻应该去检查 node 节点的日志:
journalctl -f -u kubelet
然后发现有一个 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 节点检查各个节点状况:
至此,根据 MacOS + Parallels Desktop + Centos7 的 K8S集群环境建立完结,欢迎纠正!!!
四、写在最终
k8s常见问题,可参阅博文:
-
k8s 集群布置问题整理
-
kubernetes装置实战->安稳版别v1.14.3
-
假如忘记了 node 节点的履行指令
kubeadm join
怎么办??
# 在master节点上检查token
kubeadm token list
然后在 master 上履行指令即可参加集群
kubeadm join 10.211.55.4:6443 --token 7x98z5.e56h321inwvvey58 --discovery-token-unsafe-skip-ca-verification