注意事项
Kubernetes 来自于希腊语,含义是舵手或领航员,简称 k8s。是一种基于GO开发的开源的容器编排管理工具. 类似的容器编排工具有:Docker swarm、Apache Mesos 等
在 Kubernetes 集群中,Pod 是 k8s 管理的最小单位,它是一个或多个容器的组合。 在 Pod 中,所有容器都被统一安排和调度。 Pod 中的容器有两个特点。
在常见的微服务中, 往往会部署多个微服务. 而为了保证高可用, 往往需要部署一个以上具有相同功能的微服务. 但是如果让这两个接口能够同时生效的话往往需要nginx该改微服务进行反向代理, 而Pod的出现则解决了该问题, 同一个pod来存放一个以上相同业务功能的容器, 并且共享同一网络和存储
k8s 通过控制器管理和调度 Pod。k8s 有以下几种控制器:
注意:
Service 可以管理多个 Pod 作为一个整体被外部访问。在 k8s 中有以下四种类型的 Service:
Master 节点
Master 节点是集群控制节点,负责管理和控制整个集群。基本上 k8s 的所有控制命令都发给它,它负责具体的执行过程。在 Master 上主要运行着:
Node 节点
除 master 以外的节点被称为 Node 节点,每个 Node 都会被 Master 分配一些工作 负载(Docker 容器),当某个 Node 宕机时,该节点上的工作负载就会被 Master 自动转移到其它节点上。在 Node 上主要运行着:
搭建 Kubernetes 集群有多种方式:二进制包、kubeadm、第三方工具、云平台一键安装等方式都可以,这里我们采用 kubeadm 搭建 Kubernetes 集群
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具 能通过两条指令完成一个 kubernetes 集群的部署:
创建 Master 节点
kubeadm init
将 Node 节点加入到 Master 节点中
kubeadm join <Master 节点的 IP 和端口>
创建三台 Linux 虚拟机
创建三台 Linux 虚拟机,一台作为 Master 节点,两台作为 Node 节点。 每台系统为 CentOS7,CPU 双核,内存 2G,硬盘 100G,网络选择桥接模式。 安装好后使用 SSH 工具(如 XShell)连接虚拟机,方便操作。 相关软件和虚拟机光盘映像文件分享至底部百度云
这里需要注意的是这些配置三台机器都需要配置, 可以使用xshell 撰写窗格功能, 作用是可以批量执行这些命令 可以在xshell 最上方工具栏的 查看 -> 撰写 -> 撰写窗格中打开 选择全部会话, 即可将当前打开的所有会话窗口都执行一样的命令
Kubernetes 的每个节点都需要安装 Docker、kubeadm、kubelet、kubectl
所有命令都需要批执行(master, node1, node2)
# 1. 安装yum必要的一些工具集
sudo yum install -y yum-utils device-mapper-persistent-data
# 2. 配置yum 镜像源, 加速yum 下载相关软件的速度, 选择任何一个源即可
## 阿里源
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 清华源
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 3. 安装 Docker
yum -y install docker-ce
## 如果 yum 下载过程中断开,造成 yum 程序锁定,可运行以下命令关闭 yum 程序
rm -f /var/run/yum.pid
# 4. Docker 配置加速器加速镜像下载(让docker可以更快下载docker镜像)
mkdir -p /etc/docker
touch /etc/docker/daemon.json
cat >> /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
# 5. 开机自启动 docker 服务
systemctl enable docker.service
命令虽长, 但是直接全部复制一次执行即可 所有命令都需要批执行(master, node1, node2)
# 1. 配置 yum 源镜像
## 通过 cat /etc/yum.repos.d/kubernetes.repo 查看自己配置的文件有问题(例如有空格)
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
# 2. 安装软件
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
# 3. 开机自启动k8s服务
systemctl enable kubelet.service
# 4. 查看是否安装成功 , 这种命令可以通过xshell撰写窗口一次执行所有命令
yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl
# 5. 重启虚拟机
reboot
只在master node 执行下面命令
# 1. 安装命令行上传下载软件 lrzsz (如果使用的是本博客分享的光盘镜像的话无需执行这一步, 默认已安装)
yum install -y lrzsz
# 2. 使用 rz 上传 kube-flannel.yml 文件, 文件在博客底部分享
# 3. 应用 kube-flannel.yml 文件得到运行时容器
kubectl apply -f kube-flannel.yml
# 4. 等一会儿后查看节点状态(2min左右)
kubectl get nodes
# 5. 如果需要删除节点, 则执行
kubectl delete node 节点名
容器化应用:把一个应用程序放在 docker 里部署,这个 docker 应用就是容器化应用, 在 docker 中我们通过启动镜像部署容器化应用
如何在 k8s 中部署容器化应用:
# 查看节点
kubectl get nodes (node)
# 查看 service
kubectl get service
# 查看控制器:
kubectl get deployment (deploy)
# 查看 pod
kubectl get pod
# 删除 service
kubectl delete service 服务名
# 删除控制器
kubectl delete deployment 控制器名
# 删除 pod
kubectl delete pod pod 名
图1
图2
# 1, 删除service (首先要通过kubectl get service查看要删除的service名称, 这里为nginx, 如图1)
## 删除Service以后其实相当于关闭Docker中的Container, nginx已经被关闭
kubectl delete service nginx
# 2. 删除控制器(图2)
kubectl get deploy
kubectl delete deploy nginx
# 3. 删除pod(图3)
## 因为控制器deployment用于管理pod, 所以在上一步我们将控制器删除后, 也将它管理的pod一并删除了
## 理论上删除pod命令不会用到, 具体原因可见下面注意事项
kubectl get pod
kubectl delete podname
注意:
删除顺序不能相反, 不能先删除pod, 再删除控制器.
因为控制器管理着pod, 你删除一个pod它会再次重启一个pod(图4)
图1
图2
图3
图4
# 1. 从仓库拉取镜像,通过deployment 控制器创建 pod
kubectl create deployment tomcat --image=tomcat
## 确认创建pod是否完成 , 确认该pod对应的 Ready是否为: 1/1 (准备完成), 0/1(未准备完成)
kubectl get pod
# 2. 创建 service 暴露 pod 端口(图1)
kubectl expose deployment tomcat \
--port=8080 \
--type=NodePort
## 查看 Service暴露后对应的外部端口号, 在PORT(S) 属性后 8080: 后面的端口号
kubectl get service
# 3. 访问(图2)
http://192.168.10.44:30471/
图1
图2
所需的 jdk以及springboot测试用jar已分享至底部百度云
# 1. 创建Dockerfile文件
cat <<EOF > Dockerfile
# 基于 centos7,如果没有这个镜像那么它会下载这个镜像。
FROM centos:7
# 创建者
MAINTAINER timepause
# 复制文件到指定目录并自动解压(不是真实目录而是docker容器目录)
ADD jdk-8u144-linux-x64.tar.gz /usr/local/jdk
# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_144
ENV CLASSPATH=.:$JAVA_HOME/lib
ENV PATH=$JAVA_HOME/bin:$PATH:/usr/local/jdk/jdk1.8.0_144/bin
EOF
# 2. 构建 JDK 镜像 (注意不要少了".")
docker build -t='jdk1.8' .
# 3. 查看所有的镜像,此时就多了一个 jdk1.8 17
docker images
# 4. 创建容器
docker run -di --name=jdk1.8 jdk1.8 /bin/bash
# 5. 进入容器
docker exec -it jdk1.8 /bin/bash
java -version
# 1. 使用 maven 将项目打成 jar 包,使用 rz 上传到虚拟机中
# 2. 编写Dockerfile文件
cat <<EOF > Dockerfile
FROM jdk1.8
MAINTAINER timepause
ADD springboot-k8s-1.0.0.jar /opt
RUN chmod +x /opt/springboot-k8s-1.0.0.jar
CMD java -jar /opt/springboot-k8s-1.0.0.jar
EOF
# 3. 构建项目镜像:
docker build -t springboot-k8s-1.0.0.jar .
# 4. 使用镜像启动容器(外部访问端口8085)
docker run -d -p 8085:8080 springboot-k8s-1.0.0.jar
# 5. 访问测试
http://192.168.10.44:8085/demo
上传镜像到Docker官方仓库, 作用是方便其他节点下载, 否则其他节点就必须一个个去通过上面两个步骤去构建了
# 1. 注册登录 DockerHub 网站
https://hub.docker.com
# 2. 在 DockerHub 创建镜像仓库 (springboot-k8s)
https://hub.docker.com/repositories
# 3. 在 master 节点登录 DockerHub
docker login
# 4. 将本地镜像修改为规范的镜像名称
docker tag docker 镜像名 注册用户名/仓库名
# 5. 上传镜像
docker push 注册用户名/仓库名
1. 命令行部署项目
kubectl create deployment springboot-k8s --image=注册用户名/仓库名
2. yml 文件部署项目
yml 文件是 k8s 的资源清单文件,我们可以通过 yml 文件精确修改构建参数。
暴露服务接口后, 外部便可访问
# 对外暴露pod端口
kubectl expose deployment springboot-k8s --port=8080 --type=NodePort
# 查看对外暴露端口
kubectl get service
http://NodeIP:NodePort/资源路径
Ingress 相当于是服务网关,可以通过 URL 路径代理 service,只需要暴露一个端口就可以满足所有 service 对外服务的需求,生产环境建议使用这种方式。(因为生产环境会对开放的端口进行严格的限制)
Ingress 产生的背景
我们通过 kubectl create deployment pod-name
这种命令能够快速去安装k8s 软件,本质上还是通过 yml/yaml 去安装配置并运行相关软件(但没有暴露端口因此无法访问), 我们可以通过 kubectl get service 服务名 -o yaml
来查看这个配置文件
配置文件资源清单中有三个端口(如下图):
安装部署 Ingress
. Ingress不是k8s的内置软件,需要单独安装,k8s官方使用Ingress Nginx实现Ingress功能
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/d eploy/static/provider/baremetal/deploy.yaml
我们准备一个微服务项目 demo,该项目只有一个功能:借阅图书。项目包括 eureka 注册中心,gateway 网关,用户服务,会员服务。借阅图书调用图书服务的方法,该方法 内会使用 Feign 调用会员服务的方法验证是否存在该会员。
k8s 主要是针对无状态应用设计的,所以一般情况下我们不在 K8S 中部署有状态应用,如 mysql、Eureka 等。
补充: 可通过DashBoard 对部署的服务进行动态扩容
DashBoard 是 k8s 的可视化管理工具,可以基于 web 对 k8s 集群进行集中管理。
Helm 是一个 k8s 的应用管理工具,可以很方便的通过管理 yaml 文件来部署应用,更新应用版本。目前 Heml 的 V3 版本发布,极大简化了之前繁琐的使用方式
出现背景: k8s 上的 deployment、service 等应用对象,都是由资源清单部署的。对于一个复杂的应用,会有很多类似的资源清单文件。例如微服务架构应用,组成应用的服务可能多达几 十个。如果有更新或回滚应用的需求,可能要修改维护大量 yml 文件。
Helm 中有 3 个重要概念:
# 1. 构建 Chart
helm create mychart
# 2. 进入构建好的 Chart
cd mychart/
# 3. 进入 template 文件夹
cd template/
# 4. 删除文件夹内所有自带文件
rm -rf *
# 5. 通过上面上传到docker hub的springboot生成 deployment 和 service 的 yml 文件
kubectl create deployment springboot-k8s --image=461618768/springboot-k8s --dry-run --output yaml > deployment.yaml
kubectl expose deployment springboot-k8s --port=8080 --type=NodePort --dry-run -o yaml > service.yaml
# 6. 退出到上一级目录
cd ..
# 7. 如果之前通过k8s部署安装了springboot项目, 需要删除对应的service, deploy, pod. (反之直接执行下一步)
kubectl get all
kubectl delete service springboot-k8s
kubectl delete deploy springboot-k8s
kubectl delete pod springboot-k8s
# 8. 部署 release
## helm 命令 . => 空格+点的作用是在当前文件下生效
helm install springboot-k8s .
# 9. 应用升级 helm (如下图)
## helm 命令 . => 空格+点的作用是在当前文件下生效
upgrade springboot-k8s .
在上一个实操中, 我们自定义 chart 安装 release, 通过构建 Chart 生成了一个 mychart 文件夹, 我们可以通过修改这个文件下的values.yaml 来作为 chart 模板安装 release
Master 节点扮演着总控中心的角色。如果 Master 节点故障,将无法进行任何集群管理。搭建高可用集群即在集群中搭建多个 master 节点,保证集群的安全性和稳定性。
高可用集群架构
高可用集群技术图:
在原来基础上 (1台k8s-master, 两台 node虚拟机外), 再额外安装一台新的虚拟机, 作为master节点宕机后的备用 master 节点
点赞私聊获取这些资源哦~~~
微服务项目案例代码百度云链接:https://pan.baidu.com/s/1LMApff81raccNHeFB5l0rg
提1取码:vmwj
项目所需所有软件百度云链接:https://pan.baidu.com/s/1m1wACTkCufPjbkD8-3xaeQ 点赞关注+私信获取提取码
提取码:y0ua