目录
4.3.4、Pod中多个不同容器nginx + tomcat
01. Kubernetes 简介
B站视频地址:尚硅谷 云原生 雷神https://www.bilibili.com/video/BV13Q4y1C7hS
Kubernetes 官网文档https://kubernetes.io/zh/docs/home/
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。
k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。
1.1 、Kubernetes 作用
传统部署时代:
早期,各个组织机构在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展, 并且维护许多物理服务器的成本很高。
虚拟化部署时代:
作为解决方案,引入了虚拟化。虚拟化技术允许你在单个物理服务器的 CPU 上运行多个虚拟机(VM)。 虚拟化允许应用程序在 VM 之间隔离,并提供一定程度的安全,因为一个应用程序的信息 不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器上的资源,并且因为可轻松地添加或更新应用程序 而可以实现更好的可伸缩性,降低硬件成本等等。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器部署时代:
容器类似于 VM,但是它们具有被放宽的隔离属性,可以在应用程序之间共享操作系统(OS)。 因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
1.2 、Kubernetes 特性
-
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
-
自动完成装箱计算
Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
-
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
-
密钥与配置管理3.1
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
02. Kubernetes 集群搭建
2.1、条件准备
有条件可以在在阿里云、腾讯云,青云等,购买三台服务器,至少2核2G,可以选择按量付费,没有条件可以在本机上构建三台虚拟机。我在本机构建了三台虚拟机。
系统 |
ip | 备注 | 主机名 |
CentOS 7 |
192.168.159.131 | 4核4G | k8s-master |
CentOS 7 | 192.168.159.132 | 4核4G | k8s-node1 |
CentOS 7 | 192.168.159.133 | 4核4G | k8s-node2 |
2.2、Kubernetes运行容器环境安装
安装docker
三个虚拟机上都要安装
# 安装/更新 yum-utils
yum install -y yum-utils# 配置 yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装 docker 20.10.7 版本
yum -y install docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io# 查看 docker 版本
docker -v# 启动 docker
systemctl start docker# 查看 docker 是否成功, 有 Client 和 Server 即成功
docker version
配置加速镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker# 查看是否配置成功
docker info
03、安装 Kubernetes
3.1、设置hostname
# 查看主机名
hostname# 每个主机设置主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2# 更新
bash
3.2、关闭交换区
# 查看 交换分区
free -m# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
第一行是临时禁用,第二行是永久禁用
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config# 关闭swap;第一行是临时禁用,第二行是永久禁用
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab# 允许 iptables 检查桥接流量 (K8s 官方要求)
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF# 让配置生效
sysctl --system
3.3、安装kubelet、kubeadm、kubectl
# 配置 k8s 的 yum 源地址
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 安装 kubelt、kubeadm、kubectl
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes# 启动kubelet
systemctl enable --now kubelet# 查看 kubelet 状态:一会停止 一会运行。 这个状态是对的,kubelet 等待 kubeadm 发号指令。
systemctl status kubelet
3.4、下载镜像
# 配置镜像,生成 images.sh
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF# 拉取镜像
chmod +x ./images.sh && ./images.sh
3.5、初始化主节点
# 所有机器添加 master 域名映射,以下 IP 为 master 的 IP,各节点网络互通;
# 访问 zwf.master.com 即 访问 192.168.159.131,
echo "192.168.159.131 zwf.master.com" >> /etc/hosts# 主节点初始化 (只在 master 服务器执行, 其他 node 不用)
# --apiserver-advertise-address: master 的 IP
# --control-plane-endpoint: master 的域名
# --service-cidr 和 --pod-network-cidr 是网络范围,雷神 建议不要改。要改的话 2 个cidr 和 vps(172.31.x.x) 的,3 个网络互相不能重叠;因为时虚拟机,--pod-network-cidr要修改,还要修改 calico.yaml的 IP(下图有写)。kubeadm init \
--apiserver-advertise-address=192.168.159.131 \
--control-plane-endpoint=zwf.master.com \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
初始化结果
3.6、安装网络组件
# 下载 calico.yaml
curl https://docs.projectcalico.org/v.3.20/manifests/calico.yaml -O#初始化主节点时,修改了--pod-network-cidr的值,编辑calico.yaml 文件,
放开注释,值改为初始化主节点时的值。
# 加载配置
kubectl apply -f calico.yaml
3.7、Worker 加入
在work节点执行主节点初始化时获得的命令
# 加入到 集群中,只在 2 个 node 服务器运行。
kubeadm joinzwf.master.com:6443 --token euztag.6yjbhn94ehg6nhn7 \
--discovery-token-ca-cert-hash sha256:a6e917b751e424c7a761c2276ae02db95d87ba5a3cc6b374182519ce89aba28b
3.8、令牌过期处理
令牌默认24小时有效,如果令牌过期了,重新 获取令牌。(在 master 服务器中 执行)
# 重新获取令牌
kubeadm token create --print-join-command
这里可以通过设置ttl=0为永久有效
# 重新获取令牌
kubeadm token create --print-join-command --ttl=0在 worker 服务器上 执行 上述命令 加入到 k8s 集群中。
3.9、部署 Dashboard
部署 dashboard(可视化页面),kubernetes 官方提供的可视化界面https://github.com/kubernetes/dashboard
# 根据 在线配置文件 创建资源,在master节点执行
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
成功
kubectl get pod -n kubernetes-dashboard
# 修改配置文件 找到 type,将 ClusterIP 改成 NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard