- 结构
- 部署项目步骤
- 运维工具
- 部署k8s准备工作
- Kubelet、Kubeadm、Kubectl
- 命令
- 创建控制器deployment
- 暴露端口
- k8s集群中部署nginx
- k8s集群部署微服务
- 通过dockerfile构建镜像
- 运行镜像
- 空运行测试
- k8s拉取本地镜像参数配置
- 命令部署
- yaml文件方式部署
- 暴露应用的三种方式NodePort、LoadBalancer 和 Ingress
- 添加副本数,快速扩容
结构
master:k8s主机器(也可以多个master)
node:k8s集群机器
master控制node-->service(服务)-->deployment(控制器)-->pod-->docker-->部署应用
部署项目步骤
1.项目本身打包成jar或者war包,可以通过工具
2.制作项目镜像(写dockerfile文件)
3.用k8s部署镜像(命令方式或者yaml文件方式)
4.对外暴露服务(3中方式,线上用ingress方式)
制作镜像:docker build -t 镜像名字 -f dockerfile路径 .
生成yaml文件:kubectl create deployment 控制器取名 --image=镜像名 --dry-run -o yaml>./文件名.yaml
修改yaml文件拉取本地镜像:imagePullPolicy: Never
应用yaml文件:kubectl apply -f 部署文件.yaml
查看是否启动:kubectl get pods
暴露端口(给外部访问):kubectl expose deployment nginx --port=80 --type=NodePort
运维工具
运维工具:
Ansible
Docker
docker compose ---面向一台
docker swarm ---面向docker集群
docker machine ---加入docker swarm的成员
DevOps
部署k8s准备工作
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
# 关闭swap(k8s禁止虚拟内存,提高性能)
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.1 k8smaster
192.168.1.2 k8snode
EOF
# 设置网桥参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 时间同步,多台服务器时间同步
yum install ntpdate -y
ntpdate time.windows.com
Kubelet、Kubeadm、Kubectl
安装Kubelet、Kubeadm、Kubectl
Kubelet:运行在cluster所有节点上,负责启动POD和容器
Kubeadm:用于初始化cluster
Kubectl:Kubectl是Kubenetes命令行工具,通过Kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组建
命令
kubectl get nodes # 查询有哪些节点
kubectl get pods -n kube-system # 列出pods下的资源
kubectl get namespace # 命名空间 简写:kubectl get ns
kubectl get deployment # 查控制器
kubectl get pod # 查pod
docker images # 查镜像
docker ps # 查容器
kubectl get service # 查集群服务
kubectl describe pods pod名称 # 查看pod详情事件
kubectl logs -f pod名称 # 不断输出日志
kubectl apply -f 配置文件名.yaml # 应用配置文件
创建控制器deployment
# 拉取镜像创建容器并启动,名为nginx
kubectl create deployment nginx --image=nginx
暴露端口
# 暴露nginx端口,给外部访问
kubectl expose deployment nginx --port=80 --type=NodePort
k8s集群中部署nginx
# 拉取镜像创建容器并启动,名为nginx
kubectl create deployment nginx --image=nginx
# 暴露nginx端口,给外部访问
kubectl expose deployment nginx --port=80 --type=NodePort
k8s集群部署微服务
1.项目打包(jar,war)-->采用工具打包,maven,jenkins
2.制作Dockerfile文件,生成镜像
3.kubectl create deployment 名字 --image=你的镜像名字
4.你的springboot就部署好了,是以docker容器的方式运行在pod里面
通过dockerfile构建镜像
-f :指定要使用的Dockerfile路径;
-t :镜像的名字以及标签
. :构建镜像在当前目录
docker build -t 镜像名字 -f dockerfile路径 .
运行镜像
docker run -d 镜像id
空运行测试
# 生成yaml拷贝出来改改
kubectl create deployment 控制器取名 --image=镜像名 --dry-run -o yaml>./deploy.yaml
eg:
kubectl create deployment nginx3 --image=nginx --dry-run -o yaml > ./deploy.yaml
deploy.yaml内容:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx3
name: nginx3
spec:
replicas: 1
selector:
matchLabels:
app: nginx3
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx3
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
k8s拉取本地镜像参数配置
containers:
- name: myweb
image: myweb-image
imagePullPolicy: Never
命令部署
kubectl create deployment 控制器取名 --image=镜像名
yaml文件方式部署
部署文件.yaml:资源清单
kubectl apply -f 部署文件.yaml
等价于
kubectl create deployment 控制器取名 --image=镜像名
暴露应用的三种方式NodePort、LoadBalancer 和 Ingress
# 暴露nginx端口,给外部访问
kubectl expose deployment nginx --port=80 --type=NodePort
NodePort方式
NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里;
这种方式不足:
1.一个端口只提供一个服务使用
2.只能使用30000-32767之间的端口
3.如果节点/虚拟机的IP地址发送变化,需要人工处理;
所以在生产环境,不推荐这种方式发布服务
web浏览器访问:
比如一个web应用需要被其他用户访问,那么需要配置type=NodePort,而且怕诶之nodePort=30001,那么其他机器就可以通过柳萋萋访问:scheme://node:30001访问到该服务。
NodePort 服务的 YAML 文件类似如下:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
selector:
app: my-app
spec:
type: NodePort # type配置
ports:
- name: http
port: 80 # 集群各个内部访问端口
targetPort: 80 # 容器内部端口
nodePort: 30036 # 外部暴露端口,可以指定
protocol: TCP
命令
kubectl expose deployment mysql --port=3306 --target-port=3306 --type=NodePort # 产生30000以上的随机端口
kubectl create deployment mysql --image=mysql --dry-run -o yaml > ./deploy.yaml # 测试启动,产生yaml文件
LoadBalancer方式
LoadBalancer可以暴露服务,这种方式需要向云平台申请负载均衡器
LoadBalancer 服务是暴露服务到 internet 的标准方式。在 GKE 上,这种方式会启动一个 Network Load Balancer,它将给你一个单独的 IP 地址,转发所有流量到你的服务。
何时使用这种方式?
如果你想要直接暴露服务,这就是默认方式。所有通往你指定的端口的流量都会被转发到对应的服务。它没有过滤条件,没有路由等。这意味着你几乎可以发送任何种类的流量到该服务,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意种类
缺点:
每一个用 LoadBalancer 暴露的服务都会有它自己的 IP 地址,每个用到的 LoadBalancer 都需要付费,这将会产生成本。
Ingress方式
Ingress不是k8s内置的(安装好k8s之后,并没有安装ingress),需要单独安装,而且有多种类型。我们一般选择官方维护的ingress Nginx;
有别于以上所有例子,Ingress 事实上不是一种服务类型。相反,它处于多个服务的前端,扮演着“智能路由”或者集群入口的角色。
你可以用 Ingress 来做许多不同的事情,各种不同类型的 Ingress 控制器也有不同的能力。
GKE 上的默认 ingress 控制器是启动一个 HTTP(S) Load Balancer。它允许你基于路径或者子域名来路由流量到后端服务。例如,你可以将任何发往域名 foo.yourdomain.com 的流量转到 foo 服务,将路径 yourdomain.com/bar/path 的流量转到 bar 服务。
使用ingress步骤:
1.部署ingress Nginx;
2.配置ingress niginx规则;
采用ingress暴露容器化应用(nginx):
1.部署一个容器化应用(pod),比如nginx程序
kubectl create deployment nginx --image=nginx
2.暴露该服务
kubectl expose deployment nginx --port=80 --type=NodePort
3.部署ingress nginx
https://github.com/kubernetes/ingress-nginx
ingress-nginx是使用nginx作为反向代理和负载均衡的k8s的ingress控制器;
# 下载
wget kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
329行spec下加一行:hostNetwork:true
332行修改阿里云image镜像:
阿里云镜像首页:http://dev.aliyun.com/去搜索ingress-nginx镜像
4.应用文件,自动部署ingress环境
kubectl apply -f deploy.yaml
5.查看ingress的状态
kubectl get pods -n ingress-nginx
6.应用配置ingress规则
kubectl apply -f ingress-nginx.yaml
如果报错:删除模块
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
再次应用配置ingress文件
ingress-nginx.yaml配置文件:
检查一下:
kubectl get ingress #简写kubectl get ins # 查规则
kubectl get service -n ingress-nginx
kubectl get deploy -n ingress-nginx
kubectl get pods -n ingress-nginx
GKE 上用 L7 HTTP Load Balancer 生成的 Ingress 对象的 YAML 文件类似如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
- host: mydomain.com
http:
paths:
- path: /bar/*
backend:
serviceName: bar
servicePort: 8080
何时使用这种方式?
如果你想要使用同一个 IP 暴露多个服务,这些服务都是使用相同的七层协议(典型如 HTTP),那么Ingress 就是最有用的。如果你使用本地的 GCP 集成,你只需要为一个负载均衡器付费,且由于 Ingress是“智能”的,你还可以获取各种开箱即用的特性(比如 SSL,认证,路由,等等)。
添加副本数,快速扩容
kind:deployment配置文件
--replicas=4 # 副本数4
spec:
replicas:4
kubectl apply -f 配置文件名.yaml # 应用配置