这个是我很早之前记录的,当时稀里糊涂的做了,以后有更深刻理解再修改
目录
一、docker三剑客
①、docker machine
用于在虚拟机安装容器引擎以及管理主机
②、docker compose
能够通过yaml文件在容器主机上完成多个应用
③、docker swarm
管理docker容器主机集群
二、K8s功能
1、自动装箱
配置好资源可自动部署应用容器
2、自我修复
①、容器失败,自动重启
②、部署的node(主机)节点有问题,会自动对容器重新进行部署和调整
③、容器未通过监控检查时,会关闭容器
④、直到容器正常运行时,才会对外提供服务
3、水平扩展
可对应用容器进行规模扩大或者裁剪
4、服务发现
不需要额外服务,自己就能自动实现发现和负载均衡能力
5、滚动更新
可以一次性或批量更新
6、版本回退
向前或向后都可
7、密钥配置管理
可直接进行部署和更新密钥和应用配置,类似于热部署
8、存储编排
三、K8s集群介绍
K8s集群属于中心节点架构。由Master Node和Worker Node节点组成
Master Node属于控制节点,对集群进行调度管理,接受群外用户访问集群操作请求
Worker Node属于工作节点,负责运行业务应用容器
Master Node:API server、Scheduler、ETCD数据库、Controller Manger Server
Worker Node:kubelet、kube proxy、container runtime
四、kubeadm集群搭建
1、前期准备工作
**注:**系统准备3台centos7,因为centos8支持podman,安装docker时比较麻烦
1、初期准备,比如关闭防火墙,selinux,swap分区,以及配置所有主机的域名解析
2、添加网桥过滤规则:
①、
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0 #swap关闭就不用加了
②、
modprobe br_netfilter
lsmod | grep br_netfilter
③、
sysctl -p /etc/sysctl.d/k8s.conf
3、开启ipvs:ip虚拟服务器,可以提供虚拟vip
yum install -y ipset ipvsadm
vim /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod |grep ip_vs
4、所有节点都安装docker-ce
因为k8s集群不能直接管理容器,它的最小管理单元是pod,所以它需要借助于docker管理工具。
最好安装指定版本的docker-ce-18.06.3.ce-3.el7,如果是其他版本,就将/lib/systemd/system/docker.service中ExecStart中-H及以后的内容。
开机自启并启动docker服务
vim /etc/docker/daemon.json
{
"exec-opt": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
5、k8s所需软件安装及配置
①、安装
注:在阿里云配置kubernets的yum源
kubeadm:初始化集群、管理集群等
kubelet:接受api-server指令,对pod生命周期进行管理
kubectl:集群命令管理命令
vim /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
yum list |grep kubeadm #注意会挺住等待你输入y,来确认是否导入GPG
yum install -y kubeadm kubelet kubectl
②、配置kubelet
由于kubelet与docker默认使用的cgroupdriver不一致,所以修改kubelet配置文件
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
由于还未使用kubeadm初始化,在初始化的时候才会生成kubelet的配置文件,所以现在只需要设置开机自启就可以了。
2、初始化部署
1、由于kubeadm部署集群,所有核心组件都以pod(容器)运行,所以需准备镜像。
Master节点:
kubeadm config images list #查看需那些核心组件
#编写一个脚本,由于goole连接不上,所以使用阿里
kubeadm config images list >> images.list
vim images.list
#!/bin/bash
#指定阿里仓库
DOCKER_HUB=registry.cn-hangzhou.aliyuncs.com/google_containers
#原生仓库
YUANLAI_HUB=k8s.gcr.io
#镜像变量
images='/kube-apiserver:v1.19.4
/kube-controller-manager:v1.19.4
/kube-scheduler:v1.19.4
/kube-proxy:v1.19.4
/pause:3.2
/etcd:3.4.13-0
/coredns:1.7.0'
#拉取,并标签为原生标签
for img in ${images};do
docker pull ${DOCKER_HUB}${img}
docker tag ${DOCKER_HUB}${img} ${YUANLAI_HUB}${img}
docker rmi ${DOCKER_HUB}${img}
done
Worker节点:
只需要将主节点中的kube-proxy和pause打包,传到worker节点就可以了。
2、集群初始化:Master节点操作
初始化:检查使用的版本;检查镜像是否准备(上一步已准备);交换分区情况;启动kubelet;生成各个组件证书;生成各种配置文件。
kubeadm init --apiserver-advertise-address=10.0.0.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.19.3 --pod-network-cidr=10.244.0.0/16
工作节点:
kubeadm join 10.0.0.100:6443 --token 1gkiq9.bhlaqcdunhtd2jm8 --discovery-token-ca-cert-hash sha256:f3a6042d206adc795187ea4c95a4c9bcc2f65e17c9b64357a60b12b13d05e0ae[preflight] Running pre-flight checks
五、问题
1、主节点出现的问题:
[root@master1 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 27h v1.19.3
[root@master1 ~]#kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
etcd-0 Healthy {"health":"true"}
解决:
1、先查看本地的端口,可以确认没有启动10251、10252端口,没有启动就说明有错
2、修改scheduler和controller-manager
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
#把--port=0给注释掉
# - --port=0
systemctl restart kubelet
再次检查:
[root@master1 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:10248 *:*
LISTEN 0 128 127.0.0.1:10249 *:*
LISTEN 0 128 127.0.0.1:2379 *:*
LISTEN 0 128 10.0.0.100:2379 *:*
LISTEN 0 128 10.0.0.100:2380 *:*
LISTEN 0 128 127.0.0.1:2381 *:*
LISTEN 0 128 127.0.0.1:10257 *:*
LISTEN 0 128 127.0.0.1:10259 *:*
LISTEN 0 128 127.0.0.1:46580 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 [::]:10250 [::]:*
LISTEN 0 128 [::]:10251 [::]:*
LISTEN 0 128 [::]:6443 [::]:*
LISTEN 0 128 [::]:10252 [::]:*
LISTEN 0 128 [::]:10256 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:* [::]:*
[root@master1 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 27h v1.19.3
[root@master1 ~]#kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
2、从节点加入时报错
由于加入主节点有两个认证,一个是token,另一个是主节点创建时生成的hash,hash是不变的,但是token失效了。
[root@worker2 ~]#kubeadm join 10.0.0.100:6443 --token 1gkiq9.bhlaqcdunhtd2jm8 --discovery-token-ca-cert-hash sha256:f3a6042d206adc795187ea4c95a4c9bcc2f65e17c9b64357a60b12b13d05e0ae[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "1gkiq9"
To see the stack trace of this error execute with --v=5 or higher
解决办法:主节点生成新的token,从节点去添加
[root@master1 ~]#kubeadm token create
W1113 17:09:58.951005 14398 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
r0d1gj.qturo8s7g64gac60
从节点加入:
kubeadm join 10.0.0.100:6443 --token r0d1gj.qturo8s7g64gac60 --discovery-token-ca-cert-hash sha256:f3a6042d206adc795187ea4c95a4c9bcc2f65e17c9b64357a60b12b13d05e0ae