【K8S实战】-超详细教程(二)

环境这块的这里我就不过多描述了,需要了解的可以看这篇文章【k8s搭建(超详细,保姆级教程)】。

1、Deployment

Deployment其他功能我上一篇文章已写,有兴趣的可以移步这里【K8S实战】-超详细教程(一)。
nginx-tmp.yaml文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-tmpname: nginx-tmp
spec:replicas: 2 #副本数量selector:matchLabels:app: nginx-tmptemplate:metadata:labels:app: nginx-tmpspec:containers:- image: nginximagePullPolicy: IfNotPresent #如果存在则不重新拉取镜像name: nginxrestartPolicy: Always

1.1、滚动更新

K8S初始运行状态
[root@master nginx]# kubectl get pod -A -owide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE     IP                NODE     NOMINATED NODE   READINESS GATES
default       nfs-client-provisioner-846cc9c4-4687x      1/1     Running   0          135m    192.168.166.129   node1    <none>           <none>
default       nginx-tmp-f4bb75fc8-npcw7                  1/1     Running   0          122m    192.168.166.130   node1    <none>           <none>
default       nginx-tmp-f4bb75fc8-wn2t5                  1/1     Running   0          122m    192.168.166.131   node1    <none>           <none>
......
kube-system   kube-scheduler-master                      1/1     Running   0          3h56m   172.168.200.130   master   <none>           <none>滚动更新“--record”这个是记录本次升级记录
[root@master nginx]# kubectl set image deployment nginx-tmp nginx=nginx:1.16.1 --record
deployment.apps/nginx-tmp image updated查看版本滚动更新状态,这里会先一个pod停掉启动成功,再去停掉另一个pod。
[root@master nginx]# kubectl rollout status deployment nginx-tmp
Waiting for deployment "nginx-tmp" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-tmp" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-tmp" successfully rolled out
[root@master nginx]#
[root@master nginx]#
查看历史版本,发现版本2已经更改为1.16.1了
[root@master nginx]# kubectl rollout history deployment nginx-tmp
deployment.apps/nginx-tmp
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment nginx-tmp nginx=nginx:1.16.1 --record=true

1.2、版本回退

继续【1.1、滚动更新】我弄了几个版本,目前最新的是版本4。

[root@master nginx]# kubectl rollout history deployment nginx-tmp
deployment.apps/nginx-tmp
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment nginx-tmp nginx=nginx:1.16.1 --record=true
3         kubectl set image deployment nginx-tmp nginx=nginx:1.17.6 --record=true
4         kubectl set image deployment nginx-tmp nginx=nginx:1.17.5 --record=true

1.2.1、回退上一个版本

当前版本撤销,回退上一个版本。
[root@master nginx]# kubectl rollout undo deployment nginx-tmp查看历史版本记录发现,目前版本5是最新的
[root@master nginx]# kubectl rollout history deployment nginx-tmp
deployment.apps/nginx-tmp
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment nginx-tmp nginx=nginx:1.16.1 --record=true
4         kubectl set image deployment nginx-tmp nginx=nginx:1.17.5 --record=true
5         kubectl set image deployment nginx-tmp nginx=nginx:1.17.6 --record=true

1.2.2、回退指定版本

继续【1.2.1、回退上一个版本】。

查看某个版本历史记录,这里查看了版本4的,如下是版本4的相关信息
[root@master nginx]# kubectl rollout history deployment/nginx-tmp --revision=4
deployment.apps/nginx-tmp with revision #4
Pod Template:Labels:    app=nginx-tmppod-template-hash=768b4b54bdAnnotations: kubernetes.io/change-cause: kubectl set image deployment nginx-tmp nginx=nginx:1.17.5 --record=trueContainers:nginx:Image:    nginx:1.17.5Port:   <none>Host Port:  <none>Environment:    <none>Mounts: <none>Volumes:    <none>回退到版本1
[root@master nginx]# kubectl rollout undo deployment/nginx-tmp --to-revision=1
deployment.apps/nginx-tmp rolled back查看版本历史记录,目前最新的是版本6,
[root@master nginx]# kubectl rollout history deployment/nginx-tmp
deployment.apps/nginx-tmp
REVISION  CHANGE-CAUSE
2         kubectl set image deployment nginx-tmp nginx=nginx:1.16.1 --record=true
4         kubectl set image deployment nginx-tmp nginx=nginx:1.17.5 --record=true
5         kubectl set image deployment nginx-tmp nginx=nginx:1.17.6 --record=true
6         <none>

还有一种是有状态服务,大家可以去官网自行了解【有状态服务】,这里就不过多赘述了。

2、Service

K8S的service主要作用是为了解决多个副本的访问负载及服务发现。service访问类型主要有个2种一种是ClusterIP(外网不能访问)一种是NodePort(外网能访问)。
这里以【5.1.2】的nginx-tmp.yaml进行演示。

初始运行信息
[root@k8s-m dpm]#  kubectl get pod -A -owide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE    IP                NODE     NOMINATED NODE   READINESS GATES
default       nginx-tmp-f4bb75fc8-b6r6f                  1/1     Running   0          3m21s   192.168.166.141   node1    <none>           <none>
default       nginx-tmp-f4bb75fc8-wdv27                  1/1     Running   0          3m23s   192.168.166.140   node1    <none>           <none>......
kube-system   kube-scheduler-k8s-m                       1/1     Running   3          4d6h   200.168.88.130    k8s-m    <none>           <none>

2.1、命令方式暴露Service

暴露ClusterIP一个服务
[root@k8s-m dpm]# kubectl expose deployment nginx-tmp --port=8000 --target-port=80 --type=ClusterIP
service/nginx-tmp exposed查看暴露的服务
[root@k8s-m dpm]# kubectl get svc -A
NAMESPACE     NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP                  4d6h
default       nginx-tmp    ClusterIP   10.96.225.90    <none>        8000/TCP                 34s
kube-system   kube-dns     ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   4d6h先修改下2个节点(node1,node2)的nginx主页,这样才能更好的观察。
[root@k8s-m dpm]# kubectl exec -it nginx-tmp-f4bb75fc8-b6r6f -- bash
root@nginx-tmp-f4bb75fc8-7zcl4:/#
root@nginx-tmp-f4bb75fc8-7zcl4:/# echo node1 > /usr/share/nginx/html/index.html
root@nginx-tmp-f4bb75fc8-7zcl4:/# cat /usr/share/nginx/html/index.html
node1
root@nginx-tmp-f4bb75fc8-7zcl4:/# exit
exit
command terminated with exit code 127
修改节点2的主页信息
[root@k8s-m dpm]# kubectl exec -it nginx-tmp-f4bb75fc8-wdv27 -- bash
root@nginx-tmp-f4bb75fc8-t79j5:/#
root@nginx-tmp-f4bb75fc8-t79j5:/# echo node2 > /usr/share/nginx/html/index.html
root@nginx-tmp-f4bb75fc8-t79j5:/# cat /usr/share/nginx/html/index.html
node2
root@nginx-tmp-f4bb75fc8-t79j5:/# exit
exit通过服务访问2个节点的nginx主页,这里个发现节点2可以访问,但是节点1有问题,这里其实是我在做【5.3故障转移、自愈】时实验遗留的问题,我重启过node1,那么防火墙也会运行,所以这里关掉节点1的防火墙即可。
[root@k8s-m dpm]# curl 10.96.225.90:8000
node2
[root@k8s-m dpm]# curl 10.96.225.90:8000
curl: (7) Failed connect to 10.96.225.90:8000; 没有到主机的路由去节点1机器执行如下命令关闭防火墙
[root@k8s-n1 ~]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service回到主节点再次通过服务访问,发现已经可以访问2台nginx的服务了。
在浏览器使用任意节点的IP进行访问,发现是无法访问集群内的服务的。
[root@k8s-m dpm]# curl 10.96.225.90:8000
node2
[root@k8s-m dpm]# curl 10.96.225.90:8000
node1删除该暴露的服务
[root@k8s-m dpm]# kubectl delete service nginx-tmp
service "nginx-tmp" deleted暴露一个NodePort的服务。
[root@k8s-m dpm]# kubectl expose deployment nginx-tmp --port=8000 --target-port=80 --type=NodePort
service/nginx-tmp exposed查看重新暴露后的服务信息,发现多了一个端口
[root@k8s-m dpm]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          4d6h
nginx-tmp    NodePort    10.96.32.123   <none>        8000:32617/TCP   22s

在浏览器使用任意节点的IP+暴露的端口访问即可…

2.2、Yaml方式暴露Service

暴露一个服务
[root@k8s-m svc]# kubectl apply -f nginx-svc.yaml
service/nginx-tmp created删除一个服务
[root@k8s-m svc]# kubectl delete-f nginx-svc.yaml
service/nginx-tmp created

nginx-svc.yaml文件内容如下:

apiVersion: v1
kind: Service
metadata:labels:app: nginx-tmpname: nginx-tmp
spec:ports:- protocol: TCPport: 8000targetPort: 80selector:app: nginx-tmptype: NodePort #这里的值也可以是ClusterIP

3、Ingress

Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service。

3.1、安装

下载yaml资源文件
[root@master nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml先把deploy.yaml这里的镜像替换成这个ingress-nginx-controller:v0.49.1
......
spec:dnsPolicy: ClusterFirstcontainers:- name: controller#image: k8s.gcr.io/ingress-nginx/controller:v0.46.0@sha256:52f0058bed0a17ab0fb35628ba97e8d52b5d32299fbc03cc0f6c7b9ff036b61aimage: liangjw/ingress-nginx-controller:v0.49.1imagePullPolicy: IfNotPresentlifecycle:
......创建资源
[root@master nginx]# kubectl create -f deploy.yaml查看创建请求,发现已经成功运行
[root@master nginx]# kubectl get pod,svc -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-nvvwt        0/1     Completed   0          12s
pod/ingress-nginx-admission-patch-kj4dh         0/1     Completed   1          12s
pod/ingress-nginx-controller-76cccff97f-mvxcr   0/1     Running     0          12sNAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.96.170.144   <none>        80:30171/TCP,443:31647/TCP   12s
service/ingress-nginx-controller-admission   ClusterIP   10.96.24.13     <none>        443/TCP                      12s

浏览器进行访问
http://172.168.200.130:30702/
https://172.168.200.130:30854/

3.2、使用

准备一个nginx-tmp.yaml(如果之前有的先停止掉)。

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-tmpname: nginx-tmp
spec:replicas: 2 #副本数量selector:matchLabels:app: nginx-tmptemplate:metadata:labels:app: nginx-tmpspec:containers:- image: nginximagePullPolicy: IfNotPresentname: nginxrestartPolicy: Always---
apiVersion: v1
kind: Service
metadata:labels:app: nginx-tmpname: nginx-tmp
spec:selector:app: nginx-tmpports:- port: 8000protocol: TCPtargetPort: 80

创建2个pod以及暴露服务

[root@master nginx]# kubectl get pod,svc
NAME                                        READY   STATUS    RESTARTS   AGE
pod/nfs-client-provisioner-846cc9c4-4687x   1/1     Running   0          3h21m
pod/nginx-tmp-f4bb75fc8-2lx5p               1/1     Running   0          19s
pod/nginx-tmp-f4bb75fc8-hjr2g               1/1     Running   0          19sNAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    5h2m
service/nginx-tmp    ClusterIP   10.96.42.140   <none>        8000/TCP   19s

3.2.1、域名访问

继续【3.2、使用】的实战,还需准备一个ingress-test.yaml文件。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-host-bar
spec:ingressClassName: nginxrules:- host: "demo.test.com"http:paths:- pathType: Prefixpath: "/nginx"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404backend:service:name: nginx-tmp  ## java,比如使用路径重写,去掉前缀nginxport:number: 8000

创建一个ingress

[root@master nginx]# kubectl apply -f ingress-test.yaml
ingress.networking.k8s.io/ingress-host created[root@master nginx]# kubectl get ingress
NAME           CLASS   HOSTS              ADDRESS           PORTS   AGE
ingress-host   nginx   demo.test.com   172.168.200.131   80      65s

在浏览器上使用demo.test.com:30171/nginx进行访问。注需要配置宿主机的hosts文件。

172.168.200.130 demo.test.com

3.2.2、路径重写

继续【3.2.1、域名访问】,把ingress-test.yaml作如下修改。继续深入学习可以看这里【ingress-nginx】。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/rewrite-target: /$2name: ingress-host-bar
spec:ingressClassName: nginxrules:- host: "demo.test.com"http:paths:- pathType: Prefixpath: "/nginx(/|$)(.*)"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404。/nginx(/|$)(.*)意思是会把nginx这个前缀去掉。backend:service:name: nginx-tmp  ## java,比如使用路径重写,去掉前缀nginxport:number: 8000

直接这样即可。

[root@master nginx]# kubectl apply -f ingress-test.yaml
ingress.networking.k8s.io/ingress-host configured

浏览器再次请求。

3.2.3、流量控制

继续【 3.2.2、路径重写】,ingress-test.yaml做如下调整。深入学习请移步【ingress-nginx】。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/rewrite-target: /$2nginx.ingress.kubernetes.io/limit-rps: "1" #每秒只能有一个请求name: ingress-host
spec:ingressClassName: nginxrules:- host: "demo.test.com"http:paths:- pathType: Prefixpath: "/nginx(/|$)(.*)"  # 把请求会转给下面的服务,下面的服务一定要能处理这个路径,不能处理就是404backend:service:name: nginx-tmp  ## java,比如使用路径重写,去掉前缀nginxport:number: 8000

执行如下命令:

[root@master nginx]# kubectl apply -f ingress-test.yaml
ingress.networking.k8s.io/ingress-host configured

然后在浏览器上每秒点击多次即可出现如下页面。

上一篇:【K8S实战】超详细教程(一)
下一篇:【K8S实战】超详细教程(三)

资源参考:

  • K8S官网
  • ingress-nginx官网

【K8S实战】-超详细教程(二)相关推荐

  1. 【K8S实战】-超详细教程(三)

    [K8S实战]-超详细教程(三) 1.存储 1.1.nfs默认存储 我这里只演示nfs作为K8S的默认存储,其他的可以看这里[存储类]. 1.1.1.安装nfs服务 所有机器都安装nfs工具 所有机器 ...

  2. 【K8S实战】-超详细教程(一)

    [K8S实战]-超详细教程(一) 1.环境准备 K8S环境搭建可以看这篇文章[k8s搭建(超详细,保姆级教程)],这里就不过多赘述了,有疑问欢迎留言. 2.K8S资源创建 K8S的资源创建一般有2种: ...

  3. 微服务Springcloud超详细教程+实战(二)

    微服务Springcloud超详细教程+实战(二) -------------------------------------- 远程调用方式 无论是微服务还是分布式服务(都是SOA,都是面向服务编程 ...

  4. 手把手从零开始搭建k8s集群超详细教程

    本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程 1. 基本环境搭建 1. 创建私有网络 2. 创建服务 ...

  5. geoserver 发布 矢量切片(pbf)并用openlayers 6.14 /leaflet 1.8 加载展示 (二)(小白必备:超详细教程)

    上一篇讲了 如何利用geoserver 发布矢量切片,接下来我们说 如何去展示,既然做我们就作全面吧,谁让我们gis 就是这么苦逼呢,哈哈. 环境: geoserver 2.21 vue 2.0 op ...

  6. 极验验证码破解—超详细教程(二)

    极验验证码破解-超详细教程(二) Gayhub:FanhuaandLuomu/geetest_break 2017.8.21 代码以上传,可供参考 [国家企业信用信息公示系统为例] 目录 一.网站ht ...

  7. 超详细AI二维码制作教程:手把手教你如何用Stable Diffusion 生成一个创意二维码?

    AI已来,未来已来! 来势汹汹的人工智能,如同创世纪的洪水,正在全世界的范围内引发一场史无前例的科技革命.AI正在改变世界!而我们正是这场巨变的见证者. 今天我们要介绍的内容就是:如何利用AI工具St ...

  8. mysql超详细教程_MySQL8.0.23安装超详细教程

    前言 最近在做一个人脸识别的项目,需要用数据库保存学生信息与前段交互. MySQL的优点 1.mysql性能卓越,服务稳定,很少出现异常宕机. 2.mysql开放源代码且无版权制约,自主性及使用成本低 ...

  9. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

最新文章

  1. 一对多和多对一的关系,用mybatis写
  2. Android 布局跟着NAVIGATION_BAR 重新布局
  3. 【深度学习】图文并茂!用Keras LSTM构建编码器-解码器模型
  4. 微软全部正版软件下载地址和序列号索取
  5. Arduino学习笔记-新的按键控制方式
  6. 商业互吹?扎克伯格:后悔没早点学微信
  7. python识别收件地址_Python3 自动识别地址信息
  8. padavan固件如何设置打印机
  9. Lua C API中文函数手册
  10. 大数据学习之大数据概述
  11. 跳舞的小人 和 盲文
  12. Improving Graph Collaborative Filtering with Neighborhood-enriched Contrastive Learning
  13. 计算机新建没有excel,win7系统右键新建没有word、Excel、ppT选项的图文教程
  14. 【面试题】一个Http请求的流程
  15. win10 可以复制但无法粘贴的问题
  16. 量子计算与量子信息之量子力学引论(一)
  17. 前端小报-201809 月刊
  18. 如何使用Erdas进行监督分类
  19. GLAD:大气像差与自适应光学
  20. 网易互联网网易游戏产品经理面试经验

热门文章

  1. 小红书流量高峰时间段是什么时候?早上发笔记好还是晚上好
  2. 利用shell遍历文件夹下所有文件
  3. DICOM-RT struct转换为nii.gz
  4. linux使用grep查找文件内容,Linux中使用grep命令搜索文件名及文件内容的方法
  5. 解决 win10系统zookeeper启动闪退分析
  6. Oracle数据库练习题(1)
  7. PPT另存为图片分辨率太低,设置高分辨率(300dpi)
  8. 解决pytorch官网下载慢ubuntu16.04+anaconda3(python3.6)+pytorch0.4.1+cuda9.0+cudnn7.1安装指南
  9. 有关队列的操作 python
  10. AI记者上岗,百度数字人度晓晓云上采访全国五一劳动奖获得者