K8s入门笔记
K8s介绍
以下是官网对K8s的介绍
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
我个人的理解是K8s是一个容器管理平台。当我们需要容器化部署我们的项目时,可以使用docker,但是当服务器集群复杂的时候,如上百台服务器组成集群,版本更新时需要操作上百台服务器的docker,当线上遇到问题,需要进行回滚时,也会非常麻烦。这种情况下docker就有点力不从心了,需要K8s对容器进行管理。
为什么需要K8s
从上图可以看到项目的部署可以分为三个时代,分别是传统部署时代、虚拟化部署时代、容器部署时代。
传统部署时代
最早期,在服务器上直接部署。这种方式简单快速,但缺点是无法限制单个应用程序所能使用的资源,也无法进行资源分配。可能会出现一个程序占用了大量服务器资源的情况。
虚拟化部署时代
虚拟化技术就是在服务器上运行多台虚拟机,使得应用程序之间隔离,但由于每个虚拟机是一个完整的计算机,拥有自己的操作系统,这种方式性能损耗较大。
容器部署时代
容器共享主机的操作系统,但每个容器有着自己的文件系统、CPU、内存等等,可以认为是轻量级的虚拟机。
容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些?
这就是 Kubernetes 要来做的事情! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移、部署模式等。
K8s提供:
- 服务发现和负载均衡
- 存储编排
- 自动部署和回滚
- 自动完成装箱计算
- 自我修复
- 密钥与配置管理
K8s架构
使用Kubeadm搭建K8s集群
ip | 说明 | 环境 |
---|---|---|
172.0.48.129 | K8S master | CentOS 7 |
172.0.48.131 | K8S node1 | CentOS 7 |
172.0.48.133 | K8S node2 | CentOS 7 |
K8S集群搭建
目前有一键搭建K8S集群的方法,但本次搭建采用kubeadm手动搭建。
安装K8S运行环境(所有节点执行)
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
# 检查2379和2380的端口占用情况,确保K8S的etcd能成功启用,如果被占用了,请kill掉
lsof -i:2379
lsof -i:2380
#设置epel镜像
yum install epel-release
#替换成清华镜像源
sed -e 's!^metalink=!#metalink=!g' \
-e 's!^#baseurl=!baseurl=!g' \
-e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \
-e 's!//download\.example/pub!//mirrors.tuna.tsinghua.edu.cn!g' \
-e 's!http://mirrors!https://mirrors!g' \
-i /etc/yum.repos.d/epel*.repo
将Docker的Cgroup Driver修改为systemd
# 查看Cgroup Driver
docker info|grep "Cgroup Driver"
# kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了
cat <<EOF > daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/
# 重启生效
systemctl daemon-reload
systemctl restart docker
依次修改各个节点的hostname
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
在hosts里面做相应添加
vim /etc/hosts
172.0.48.129 master
172.0.48.131 node1
172.0.48.133 node2
# 配置K8S的阿里云yum源(如果发现阿里云源下载慢,可以替换成清华源)
cat <<EOF > /etc/yum.repos.d/kubernetes.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
EOF
# 添加 Docker 安装源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
下载kubelet、kubectl、kubeadm
yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 --disableexcludes=kubernetes
# 如果上述命令下载失败,请用下面的命令下载
yum install -y --nogpgcheck kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 --disableexcludes=kubernetes
下载完毕之后启动并设置 kubelet 开机启动
systemctl start kubelet
systemctl enable --now kubelet
初始化集群(仅master节点执行)
kubeadm init \
--apiserver-advertise-address 172.0.48.129 \
--control-plane-endpoint 172.0.48.129 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--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/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join kuber4s.api:6443 --token zd42s0.s2tabpwrvakxm2yu \
--discovery-token-ca-cert-hash sha256:e8951771ecb37cd1bf4813c4dbff064cf30296957be1773311a229fcc3cd05e1 \
--control-plane --certificate-key 1ff38a74d6ae1993ea392b4312ecb1692b52a5ac7fd0a624fe0cea01e39acead
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join kuber4s.api:6443 --token zd42s0.s2tabpwrvakxm2yu \
--discovery-token-ca-cert-hash sha256:e8951771ecb37cd1bf4813c4dbff064cf30296957be1773311a229fcc3cd05e1
执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络组件flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
检查coreDNS状态,当coreDNS为running状态时,说明集群运行正常,可以让work节点加入master。
kubectl get pods --all-namespaces
worker节点加入master组成集群
在worker节点执行刚刚master节点打印出来的加入语句(如果忘了可以在master节点执行kubeadm token create --print-join-command
重新获取)
kubeadm join kuber4s.api:6443 --token zd42s0.s2tabpwrvakxm2yu \
--discovery-token-ca-cert-hash sha256:e8951771ecb37cd1bf4813c4dbff064cf30296957be1773311a229fcc3cd05e1
检查集群状态
在master节点执行,全部节点处于ready状态
kubectl get nodes
在master节点执行,所有pods处于running状态
kubectl get pods --all-namespaces
以上两项都检查通过说明K8S集群正常运行。