Kubernetes核心概念
Master主要负责资源调度,控制副本,和提供统一访问集群的入口。--核心节点也是管理节点
Node是Kubernetes集群架构中运行Pod的服务节点。Node是Kubernetes集群操作的单元,用来承载被分配Pod的运行,是Pod运行的宿主机,由Master管理,并汇报容器状态给Master,同时根据Master要求管理容器生命周期。
Node节点的IP地址,是Kubernetes集群中每个节点的物理网卡的IP地址,是真是存在的物理网络,所有属于这个网络的服务器之间都能通过这个网络直接通信;
Pod直译是豆荚,可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个Pod)。在k8s中我们不会直接操作容器,而是把容器包装成Pod再进行管理,运行于Node节点上, 若干相关容器的组合。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过localhost进行通信。Pod是k8s进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个Pod可以包含一个容器或者多个相关容器。Pod 就是 k8s 世界里的"应用";而一个应用,可以由多个容器组成。
pause容器每个Pod中都有一个pause容器,pause容器做为Pod的网络接入点,Pod中其他的容器会使用容器映射模式启动并接入到这个pause容器。
Pod Volume,数据卷,挂载宿主机文件、目录或者外部存储到Pod中,为应用服务提供存储,也可以解决Pod中容器之间共享数据。
配置一下本地解析
vim /etc/hosts
安装docker应用
每个节点都需要下载
yum install -y yum-utils device-mapper-persistent-data lvm2 git
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
如果使用的挂载磁盘则需要更改docker的数据目录
如果是启动过的docker则需要停止docker服务 然后把 /var/lib/docker/目录下的数据移动到新的目录 mv /var/lib/docker/ /data/docker/
修改docker默认数据存储目录配置,在/etc/docker/daemon.json文件添加 以下内容,若是没有/etc/docker/daemon.json文件,则新建该文件
vim /etc/docker/daemon.json
{
"data-root": "/data/docker"
}
systemctl start docker 启动
systemctl enable docker 设置开机自启
关闭swap分区
Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。方法一,通过kubelet的启动参数–fail-swap-on=false更改这个限制。方法二,关闭系统的Swap。
每个节点都需要关闭
swapoff -a
vim /etc/fstab 注释掉SWAP的自动挂载
使用free -m确认swap已经关闭。
拉取docker镜像
初始化的时候,它会自动拉取镜像但是自动拉取用的是k8s官网的源地址容易失败所以手动拉取aliyun的镜像。注意拉取的docker镜像的版本必须要和kubelet、kubectl的版本保持一致。在下面初始化时直接指定阿里云的镜像
vim dockerpull.sh
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.9.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
bash dockerpull.sh 执行脚本拉取镜像
docker images 看下镜像是否都拉取成功
cri-dockerd安装
注意部署最新版本1.26.2 默认不在是使用docker容器所以需要下载一个插件
所有节点都需要下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm
修改/usr/lib/systemd/system/cri-docker.service文件中ExecStart配置kubelet使用pause镜像
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
systemctl daemon-reload
systemctl enable --now cri-docker
加载ipvs相关内核模块
vim mod.sh
#!/bin/bash
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
modprobe br_netfilter
chmod +x mod.sh
bash mod.sh
scp mod.sh k8s-node1:/root/ 发送后记得执行一下
scp mod.sh k8s-node2:/root/ 发送后记得执行一下
vim /etc/rc.local 如果重新开机,需要重新加载(所以写在 /etc/rc.local 中开机自动加载)
chmod +x /etc/rc.local
配置转发相关参数,否则可能会出错
cat <
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
EOF
sysctl --system 使配置生效
lsmod | grep ip_vs 查看是否加载成功
安装kubeadm和kubelet:
所有节点都需要安装
配置阿里云的yum源
cat <
[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
EOF
scp /etc/yum.repos.d/kubernetes.repo k8s-node1:/etc/yum.repos.d/kubernetes.repo
scp /etc/yum.repos.d/kubernetes.repo k8s-node2:/etc/yum.repos.d/kubernetes.repo
安装
yum makecache fast -y
yum install -y kubelet kubeadm kubectl ipvsadm #注意,这样默认是下载最新版本
如果想下载旧版本,后面要跟上指定的版本号
yum install -y kubelet-1.22.2-0.x86_64 kubeadm-1.22.2-0.x86_64 kubectl-1.22.2-0.x86_64 ipvsadm
启动kubelet
systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet
systemctl status kubelet查看一下状态你会发现报错误信息;(每个节点都会报错),不用管master节点初始化之后就好了。
配置master节点初始化
kubeadm init --help可以查看命令的具体参数用法
在master节点执行初始化(node节点不用执行)
参数详情:
apiserver-advertise-address 指定apiserver的IP,即master节点的IP
image-repository 设置镜像仓库为国内的阿里云镜像仓库
kubernetes-version 设置k8s的版本,跟步骤三的kubeadm版本一致
service-cidr 这是设置node节点的网络的,暂时这样设置
pod-network-cidr 这是设置node节点的网络的,暂时这样设置
cri-socket 设置cri使用cri-dockerd
kubeadm init --apiserver-advertise-address=192.168.197.136 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.26.2 --service-cidr=10.168.0.0/12 --pod-network-cidr=10.244.0.0/16 --cri-socket unix:///var/run/cri-dockerd.sock --ignore-preflight-errors=all
执行完初始化的命令 查看一下回显是否成功
echo $?
初始化完成后根据提示的命令操作即可
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果使用的root用户可以操作这条命令
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl get nodes 操作完以上步骤查看一下node节点已经可以看到master了
配置flannel网络插件
完成master节点的时候k8s已经叫我们去配置pod网络了。在k8s系统上Pod网络的实现需要依赖于第三方插件进行种类有很多我们这里使用的flannel。
cd ~ && mkdir flannel && cd flannel
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
vim kube-flannel.yml 查看一下镜像版本
拉取要用到的镜像所有节点都要拉取
docker pull docker.io/flannel/flannel:v0.21.2
docker pull docker.io/flannel/flannel-cni-plugin:v1.1.2
kubectl apply -f kube-flannel.yml 运行
查看一下master节点的状态
从NoReady 变成了 Ready 那么我们的flannel就部署好了
Node节点加入集群操作命令
Node1 节点操作
kubeadm join 192.168.197.136:6443 --token 8isrry.zd97vxqtsg7vw2dx \
--discovery-token-ca-cert-hash sha256:e2efbe684211b437d40c03a2e512f31982716caa38b51c7f88f1516c166de76e --cri-socket unix:///var/run/cri-dockerd.sock
加入node1节点时报错,发现是忘记修改主机名导致的(开始修改过主机名没有这个报错)
所有机器修改一下主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
然后node1节点要删除刚刚生成的证书重新执行加入集群的命名
rm -rf /etc/kubernetes/pki/ca.crt
Node所有节点操作
kubeadm join 192.168.197.136:6443 --token 8isrry.zd97vxqtsg7vw2dx \
--discovery-token-ca-cert-hash sha256:e2efbe684211b437d40c03a2e512f31982716caa38b51c7f88f1516c166de76e --cri-socket unix:///var/run/cri-dockerd.sock
然后来到master节点查看一下node信息
kubectl get nodes
kubectl get pods --namespace kube-flannel 看下flannel运行状态
Node两个节点也已经加入成功
删除node节点操作
kubectl delete nodes node节点名称
添加已删除node节点操作
1.停止被删除node节点的kubectl systemctl stop kubelet
2.删除相关文件 rm -rf /etc/kubernetes/*
3.添加节点 注意token未失效(token有效期24小时)才能这样操作 kubeadm join 192.168.197.136:6443 --token 8isrry.zd97vxqtsg7vw2dx --discovery-token-ca-cert-hash sha256:e2efbe684211b437d40c03a2e512f31982716caa38b51c7f88f1516c166de76e --cri-socket unix:///var/run/cri-dockerd.sock
Token过期后有新的节点加入操作
kubeadm token create --print-join-command Token重新生成的命令
重新生成的token加上 --cri-socket unix:///var/run/cri-dockerd.sock 参数在新节点执行即可
服务器准备:
192.168.197.136 (k8s-master)
192.168.197.137 (k8s-node1)
192.168.197.138 (k8s-node2)
主机名修改
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
关闭防火墙和selinux
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
vim /etc/selinux/config