Kubernetes(K8s)
1. What is Kubernetes?
部署容器化应用,可以对dorker容器进行编排
2. Kubernetes 架构
用户 -》 主节点 -》 从节点
k8s构成:
-
master
-
API Server 所有请求的唯一入口
-
Etcd 存储集群数据,自动服务发现3个
-
controller-manager pod管理
pod 有有状态 无状态 需要持久化数据
-
sheduler 调度器 调度资源确认部署在Node
-
-
nodes
- kubelet master在node 上的代理,api下发任务,kubelet管理node调度管理pod
- kube-proxy 在node实现pod网络代理
- container runtime 容器引擎
pod 是短暂的 controller确定pod数量
service 防止pod失联
pollcies 策略
labels 标签
namespaces 命名空间 隔离作用
3.安装k8s
服务器硬件配置要求
- 在开始部署k8s集群之前,服务器需要满足以下条件:
- 1️⃣一台或多台服务器,操作系统CentOS 7.x-86_x64。
- 2️⃣硬盘配置:内存2GB或更多,CPU2核或更多,硬盘30GB或更多。
- 3️⃣集群中的所有机器之间网络互通。
- 4️⃣可以访问外网,需要拉取镜像。
- 5️⃣禁止swap分区。
部署 Kubernetes 环境(集群)主要有多种方式:
(1)minikube
minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便您可以试用Kubernetes或进行日常开发工作;
(2)kind
Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker;
(3)kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;
官方地址:
(4)二进制包
从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是能让你对各个组件有更清晰的认识;
(5)yum安装
通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老了,所以这种方式用得也比较少了;
(6)第三方工具
有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;
(7)花钱购买
直接购买类似阿里云这样的公有云平台k8s,一键搞定;
Kubeadm部署Kubernetes
kubeadm是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署;
1、创建一个Master节点:
kubeadm init
2、将Node节点加入到Master集群中:
$ kubeadm join <Master节点的IP和端口>
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
setenforce 0 #临时
# 关闭swap(k8s禁止虚拟内存以提高性能)
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
swapoff -a #临时
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.172.134 k8smaster
192.168.172.135 k8snode
# 设置网桥参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl --system #生效
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
4. 使用k8s部署docker
步骤:
- 程序打包 maven - > jar
- 使用dokerFile 制作生成docker镜像 ,上传到远程镜像仓库 push
- k8s拉取镜像,运行容器,设置对外暴露端口
eg:
# 打包
# 制作镜像
# 拉取启动
kubectl create deployment nginx --image=nginx:lastest
# 暴露端口 之后可以查看Service
kubectl expose deployment nginx --port=80 --type=NodePort
# 访问
kubectl get deployment
kubectl delete deployment nginx 删除控制器
kubectl get pod(s)
kubectl delete pod nginx~
kubectl get service(s)
kubectl --help
# 空运行
kubectl create deployment springboot-jar --dry-run -o yaml > boot-delpoy.yaml
# 会生成yaml 文件
# 通过yml文件部署(清单)
kubectl apply -f boot-deploy.yaml
5.图形化界面
- 下载镜像
- 部署
- 创建账号
- 绑定权限
- 获取token
6. yml 配置详解
# 【必须】版本号
apiVersion: v1
# 【必选】Pod
kind: Pod
# 【必选-Object】元数据
metadata:
# 【必选】 Pod的名称
name: String
# 【必选】 Pod所属的命名空间
namespace: String
# 【List】 自定义标签列表
labels:
- name: String
# 【List】 自定义注解列表
annotations:
- name: String
# 【必选-Object】 Pod中容器的详细定义
spec:
# 【必选-List】 Pod中容器的详细定义
containers:
# 【必选】 容器的名称
- name: String
# 【必选】 容器的镜像名称
image: String
# 【String】 每次都尝试重新拉取镜像 | 仅使用本地镜像 | 如果本地有镜像则使用,没有则拉取
imagePullPolicy: [Always | Never | IfNotPresent]
# 【List】 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令
command: [String]
# 【List】 容器的启动命令参数列表
args: [String]
# 容器的工作目录
workingDir: String
# 【List】 挂载到容器内部的存储卷配置
volumeMounts:
# 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
- name: String
# 存储卷在容器内mount的绝对路径,应少于512个字符
mountPath: Sting
# 是否为只读模式,默认为读写模式
readOnly: Boolean
# 【List】 容器需要暴露的端口号列表
ports:
# 端口的名称
- name: String
# 容器需要监听的端口号
containerPort: Int
# 容器所在主机需要监听的端口号,默认与containerPort相同。设置hostPort时,同一台宿主机将无法启动该容器的第二份副本
hostPort: Int
# 端口协议,支持TCP和UDP,默认值为TCP
protocol: String
# 【List】 容器运行前需设置的环境变量列表
env:
# 环境变量的名称
- name: String
# 环境变量的值
value: String
# 【Object】 资源限制和资源请求的设置
resources:
# 【Object】 资源限制的设置
limits:
# CPU限制,单位为core数,将用于docker run --cpu-shares参数
cpu: String
# 内存限制,单位可以为MB,GB等,将用于docker run --memory参数
memory: String
# 【Object】 资源限制的设置
requests:
# cpu请求,单位为core数,容器启动的初始可用数量
cpu: String
# 内存请求,单位可以为MB,GB等,容器启动的初始可用数量
memory: String
# 【Object】 对Pod内各容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器。可以设置的方法包括:exec、httpGet和tcpSocket。对一个容器只需要设置一种健康检查的方法
livenessProbe:
exec: # 【Object】 对Pod内各容器健康检查的设置,exec方式
command: [String] # exec方式需要指定的命令或者脚本
httpGet: # 【Object】 对Pod内各容器健康检查的设置,HTTGet方式。需要指定path、port
path: String
port: Number
host: String
scheme: String
httpHeaders:
- name: String
value: String
tcpSocket: # 【Object】 对Pod内各容器健康检查的设置,tcpSocket方式
port: Number
# 容器启动完成后首次探测的时间,单位为s
initialDelaySeconds: Number
# 对容器健康检查的探测等待响应的超时时间设置,单位为s,默认值为1s。若超过该超时时间设置,则将认为该容器不健康,会重启该容器。
timeoutSeconds: Number
# 对容器健康检查的定期探测时间设置,单位为s,默认10s探测一次
periodSeconds: Number
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: Boolean
# Pod的重启策略 一旦终止运行,都将重启 | 终止后kubelet将报告给master,不会重启 | 只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常终止(退出码为0),则不会重启。
restartPolicy: [Always | Never | OnFailure]
# 设置Node的Label,以key:value格式指定,Pod将被调度到具有这些Label的Node上
nodeSelector: object
# 【Object】 pull镜像时使用的Secret名称,以name:secretkey格式指定
imagePullSecrets:
- name: String
# 是否使用主机网络模式,默认值为false。设置为true表示容器使用宿主机网络,不再使用docker网桥,该Pod将无法在同一台宿主机上启动第二个副本
hostNetwork: Boolean
# 【List】 在该Pod上定义的共享存储卷列表
volumes:
# 共享存储卷的名称,volume的类型有很多emptyDir,hostPath,secret,nfs,glusterfs,cephfs,configMap
- name: String
# 【Object】 类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值为一个空对象:emptyDir: {}
emptyDir: {}
# 【Object】 类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
hostPath:
# Pod所在主机的目录,将被用于容器中mount的目录
path: String
# 【Object】类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
secret:
secretName: String
items:
- key: String
path: String
# 【Object】 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
configMap:
name: String
items:
- key: String
path: String
7. 端口暴露Ingress
k8s应用结构:
-
ingress
-
a.com
-
service
- pod
- pod
- pod
-
-
b.com
-
service
- pod
- pod
- pod
-
-
c.com
-
service
- pod
- pod
- pod
-
-
k8s 集群内部pod,service都有自己的IP但是无法提供外网访问
可以通过NodePort的方式暴露服务,但不灵活
生产中: Ingress 相当于集群网关,不是k8s自带的,可以通过ingress-nginx
- 安装Ingress Nginx
- 配置规则
8 部署微服务项目
-
项目本身打jar包或war
-
制作镜像(Dockerfile文件)
FROM jdk1.8.0_251 MAINTAINER zhj ADD spring-cloud-alibaba-gateway-1.0.0.jar /opt RUN chmod +x /opt/spring-cloud-alibaba-gateway-1.0.0.jar CMD java -jar /opt/spring-cloud-alibaba-gateway-1.0.0.jar
docker build -t spring-cloud-alibaba-gateway-1.0.0 -f Dockerfile-gateway .
构建镜像
docker build -t {镜像名} -f {Dokerfile文件名} .
-
k8s 部署服务
(1)
kubectl create deployment spring-cloud-alibaba-gateway --image=spring-cloud-alibaba-gateway-1.0.0 --dry-run -o yaml > gateway-delpoy.yaml
从本地获取镜像需要在 gateway-delpoy.yaml中配置
containers:
-image: spring-cloud-alibaba-gateway-1.0.0
imagePullPolicy: Never # 不拉取
(2)
kubectl apply -f gateway-delpoy.yaml
可以支持快速扩容
-
k8s 暴露服务
kubectl expose deployment spring-cloud-alibaba-gateway --port=8080 --target-port = 8080 --type=NodePort
target-port 代表程序运行时使用的端口(代码)
port 容器对外的端口(容器之间访问的端口)
node-port 代表服务器对外暴露的端口 一般都是30000+的
-
kubectl logs -f {pod名 } # 查看日志
-
配置ingress-nginx 绑定域名
k8s适用于无状态服务,有状态服务适合单独部署
有状态数据库,配置中心,注册中心