006.kubernets之Deployment简单部署
一 Deployment相对于RC的优势
RS与Deployment主要用于替代RC。RS的全称为Replica Set。相对于RC,RS与Deployment的优势如下:
- RC只支持基于等式的selector,如env=dev或者environment!=qa。但在RS中,还支持新的基于集合的selector,如version in (v1.0,v2.0)或者env not in (dev,qa)。这给复杂的运维管理带来方便
- 使用Deployment升级Pod只需要定义Pod的最终状态,k8s会为你执行必要的操作。虽然使用kubectl rolling-update也可以完成滚动升级,但它是在客户端与服务端多次交互控制RC完成的,所以REST API中并没有rolling-update的接口,这为定制自己的管理系统带来了一些麻烦。Deployment拥有更加灵活的升级、回滚功能。
Replica Set目前与RC的区别只是支持的selector不同,后续会加入更多的功能。Deployment使用了Replica Set,是更高一层的概念。除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用Deployment而不直接使用Replica Set。
二 Deployment是简单使用
2.1 同时安装三个nginx pod
[root@docker-server1 manifests]# cd /yamls/
[root@docker-server1 yamls]# mkdir deployment
[root@docker-server1 yamls]# cd deployment
[root@docker-server1 deployment]# vim nginx-deployment.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: hello-deployment
- namespace: default
- spec:
- replicas:
- selector:
- matchLabels:
- name: hello-deployment
- strategy:
- type: RollingUpdate
- rollingUpdate:
- maxSurge: %
- maxUnavailable:
- template:
- metadata:
- labels:
- name: hello-deployment
- spec:
- containers:
- - name: webserver
- image: nginx:1.4
- ports:
- - containerPort:
[root@docker-server1 deployment]# kubectl apply -f nginx-deployment.yaml
2.2 查看
[root@docker-server1 deployment]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- goproxy / Running 126m
- hello-deployment-c6fb6d858-9g5pq / ErrImagePull 11s
- hello-deployment-c6fb6d858-qnnld / ErrImagePull 11s
- hello-deployment-c6fb6d858-v549m / ErrImagePull 11s
- init-demo / Running 68m
- nginx / Running 4h13m
- nginx-volume / Running 88m
[root@docker-server1 deployment]# kubectl get pods -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- goproxy / Running 126m 10.244.1.8 192.168.132.132 <none> <none>
- hello-deployment-c6fb6d858-9g5pq / ImagePullBackOff 21s 10.244.2.11 192.168.132.133 <none> <none>
- hello-deployment-c6fb6d858-qnnld / ImagePullBackOff 21s 10.244.1.12 192.168.132.132 <none> <none>
- hello-deployment-c6fb6d858-v549m / ImagePullBackOff 21s 10.244.1.13 192.168.132.132 <none> <none>
- init-demo / Running 68m 10.244.1.10 192.168.132.132 <none> <none>
- nginx / Running 4h14m 10.244.2.10 192.168.132.133 <none> <none>
- nginx-volume / Running 89m 10.244.1.9 192.168.132.132 <none> <none>
[root@docker-server1 deployment]# kubectl describle pods hello-deployment-c6fb6d858-v549m
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal Scheduled <unknown> default-scheduler Successfully assigned default/hello-deployment-c6fb6d858-v549m to 192.168.132.132
- Normal Pulling 4m36s (x4 over 6m20s) kubelet, 192.168.132.132 Pulling image "nginx:1.4"
- Warning Failed 4m32s (x4 over 6m12s) kubelet, 192.168.132.132 Failed to pull image "nginx:1.4": rpc error: code = Unknown desc = Error response from daemon: manifest for nginx:1.4 not found: manifest unknown: manifest unknown
- Warning Failed 4m32s (x4 over 6m12s) kubelet, 192.168.132.132 Error: ErrImagePull
- Warning Failed 4m8s (x7 over 6m11s) kubelet, 192.168.132.132 Error: ImagePullBackOff
- Normal BackOff 74s (x19 over 6m11s) kubelet, 192.168.132.132 Back-off pulling image "nginx:1.4"
是nginx:1.4没有这个镜像
2.3 滚动更新
修改为1.14版本,就会自己更新
滚动更新策略
1 先删后起
2 先起后删
[root@docker-server1 deployment]# kubectl apply -f nginx-deployment.yaml
[root@docker-server1 deployment]# kubectl get pods -o wide
- hello-deployment-5fdb46d67c-jvvjr / ContainerCreating 0 4s <none> 192.168.132.132 <none> <none>
- hello-deployment-c6fb6d858-9g5pq / ImagePullBackOff 8m15s 10.244.2.11 192.168.132.133 <none> <none>
- hello-deployment-c6fb6d858-qnnld / ImagePullBackOff 8m15s 10.244.1.12 192.168.132.132 <none> <none>
- hello-deployment-c6fb6d858-v549m / ImagePullBackOff 8m15s 10.244.1.13 192.168.132.132 <none> <none>
[root@docker-server1 deployment]# kubectl get pods -o wide
- hello-deployment-5fdb46d67c-7ct2z / ContainerCreating 9s <none> 192.168.132.133 <none> <none>
- hello-deployment-5fdb46d67c-jvvjr / Running 34s 10.244.1.14 192.168.132.132 <none> <none>
- hello-deployment-c6fb6d858-9g5pq / ImagePullBackOff 8m45s 10.244.2.11 192.168.132.133 <none> <none>
- hello-deployment-c6fb6d858-qnnld / ImagePullBackOff 8m45s 10.244.1.12 192.168.132.132 <none> <none>
已经运行成功更新一个
[root@docker-server1 deployment]# kubectl get pods -o wide
- hello-deployment-5fdb46d67c-7ct2z / Running 118s 10.244.2.12 192.168.132.133 <none> <none>
- hello-deployment-5fdb46d67c-jvvjr / Running 2m23s 10.244.1.14 192.168.132.132 <none> <none>
- hello-deployment-5fdb46d67c-qfjht / Running 90s 10.244.1.15 192.168.132.132 <none> <none
全部更新
二 部署一个word press网站
2.1 部署mysql
[root@docker-server1 deployment]# vim mysql-deployment.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: mysql
- namespace: default
- spec:
- replicas:
- selector:
- matchLabels:
- app: mysql
- template:
- metadata:
- labels:
- app: mysql
- spec:
- containers:
- - name: mysql
- image: mysql:5.7
- ports:
- - containerPort:
- env:
- - name: MYSQL_ROOT_PASSWORD
- value: RedHat123
- - name: MYSQL_DATABASE
- value: wordpress
[root@docker-server1 deployment]# kubectl apply -f mysql-deployment.yaml
[root@docker-server1 deployment]# kubectl get pods
- mysql-5d4695cd5-kq9cl 0/1 ContainerCreating 0 8s
[root@docker-server1 deployment]# yum -y install mysql
[root@docker-server1 deployment]# kubectl get pods
- NAME READY STATUS RESTARTS AGE
- goproxy 1/1 Running 0 149m
- hello-deployment-5fdb46d67c-7ct2z 1/1 Running 0 15m
- hello-deployment-5fdb46d67c-jvvjr 1/1 Running 0 15m
- hello-deployment-5fdb46d67c-qfjht 1/1 Running 0 14m
- init-demo 1/1 Running 0 92m
- mysql-5d4695cd5-kq9cl 1/1 Running 0 102s
- nginx 2/2 Running 4 4h37m
- nginx-volume 1/1 Running 0 112m
[root@docker-server1 deployment]# kubectl get pods -o wide
- mysql-5d4695cd5-kq9cl / Running 3m22s 10.244.1.16 192.168.132.132
[root@docker-server1 deployment]# mysql -uroot -pRedHat123 -h10.244.1.16
2.2 部署wordpress
[root@docker-server1 deployment]# vi wordpress-deployment.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: wordpress
- namespace: default
- spec:
- replicas:
- selector:
- matchLabels:
- app: wordpress
- template:
- metadata:
- labels:
- app: wordpress
- spec:
- nodeName: 192.168.1.233
- containers:
- - name: wordpress
- image: wordpress:5.3.-php7.-apache
- ports:
- - containerPort:
- env:
- - name: WORDPRESS_DB_PASSWORD
- value: RedHat123
- - name: WORDPRESS_DB_NAME
- value: wordpress
- - name: WORDPRESS_DB_HOST
- value: 10.244.1.16
- - name: WORDPRESS_DB_USER
- value: root
[root@docker-server1 deployment]# kubectl apply -f wordpress-deployment.yaml
[root@docker-server1 deployment]# kubectl get pods -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- goproxy / Running 164m 10.244.1.8 192.168.132.132 <none> <none>
- init-demo / Running 106m 10.244.1.10 192.168.132.132 <none> <none>
- mysql-5d4695cd5-kq9cl / Running 16m 10.244.1.16 192.168.132.132 <none> <none>
- nginx / Running 4h51m 10.244.2.10 192.168.132.133 <none> <none>
- nginx-volume / Running 127m 10.244.1.9 192.168.132.132 <none> <none>
- wordpress-86cbfc4456-zp985 / ContainerCreating 2s <none> 192.168.132.131 <none> <none>
[root@docker-server1 deployment]# kubectl describe pods wordpress-86cbfc4456-zp985
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal Pulling 3m5s kubelet, 192.168.132.131 Pulling image "wordpress:5.3.2-php7.2-apache"
- Normal Pulled 97s kubelet, 192.168.132.131 Successfully pulled image "wordpress:5.3.2-php7.2-apache"
- Normal Created 94s kubelet, 192.168.132.131 Created container wordpress
- Normal Started 94s kubelet, 192.168.132.131 Started container wordpress
[root@docker-server1 deployment]# kubectl get pods -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- goproxy / Running 167m 10.244.1.8 192.168.132.132 <none> <none>
- init-demo / Running 109m 10.244.1.10 192.168.132.132 <none> <none>
- mysql-5d4695cd5-kq9cl / Running 19m 10.244.1.16 192.168.132.132 <none> <none>
- nginx / Running 4h55m 10.244.2.10 192.168.132.133 <none> <none>
- nginx-volume / Running 130m 10.244.1.9 192.168.132.132 <none> <none>
- wordpress-86cbfc4456-zp985 / Running 3m9s 10.244.0.4 192.168.132.131 <none> <none>
2.3 service资源对象创建MySQL的转发
负载均衡器对象,通过创建 service资源对象,会在ku即e- proxy上为这一类资源创建一个負载均衡器,并为其生成一个集群内部可访问的不变的VIP
[root@docker-server1 deployment]# mkdir /yamls/svcs
[root@docker-server1 deployment]# cd /yamls/svcs
[root@docker-server1 svcs]# vi mysql-svc.yaml
- apiVersion: v1
- kind: Service
- metadata:
- name: mysql-svc
- spec:
- selector: #匹配label
- app: mysql
- type: ClusterIP
- ports:
- - port: 3306
- targetPort:
[root@docker-server1 svcs]# kubectl apply -f mysql-svc.yaml
[root@docker-server1 svcs]# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.1 <none> /TCP 10h
- mysql-svc ClusterIP 10.96.240.104 <none> /TCP 18s
[root@docker-server1 svcs]# cat mysql-svc.yam
- apiVersion: v1
- kind: Service
- metadata:
- name: mysql-svc
- spec:
- selector:
- app: mysql
- type: ClusterIP
- clusterIP: 10.96.240.104
- ports:
- - port:
- targetPort:
[root@docker-server1 svcs]# kubectl delete -f mysql-svc.yaml
[root@docker-server1 svcs]# kubectl apply -f mysql-svc.yaml
[root@docker-server1 svcs]# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.1 <none> /TCP 10h
- mysql-svc ClusterIP 10.96.240.104 <none> /TCP 7s
[root@docker-server1 svcs]# mysql -uroot -pRedHat123 -h10.96.240.104
在这里连接很慢
[root@docker-server1 deployment]# kubectl get svc --all-namespaces
- NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- default kubernetes ClusterIP 10.96.0.1 <none> /TCP 11h
- default mysql-svc ClusterIP 10.96.240.104 <none> /TCP 9m37s
- kube-system kube-dns ClusterIP 10.96.0.10 <none> /UDP,/TCP,/TCP 11h
- kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.93.119 <none> /TCP 10h
- kubernetes-dashboard kubernetes-dashboard NodePort 10.96.87.98 <none> :/TCP 10h
2.4 修改wordspress
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: wordpress
- namespace: default
- spec:
- replicas:
- selector:
- matchLabels:
- app: wordpress
- template:
- metadata:
- labels:
- app: wordpress
- spec:
- nodeName: 192.168.132.131
- containers:
- - name: wordpress
- image: wordpress:5.3.-php7.-apache
- ports:
- - containerPort:
- env:
- - name: WORDPRESS_DB_PASSWORD
- value: RedHat123
- - name: WORDPRESS_DB_NAME
- value: wordpress
- - name: WORDPRESS_DB_HOST
- value: 10.96.240.104 #修改这个IP,为serviceIP
- - name: WORDPRESS_DB_USER
- value: root
2.5 外部访问wordpress
[root@docker-server1 svcs]# vi wordpress-svc.yaml
- apiVersion: v1
- kind: Service
- metadata:
- name: wordpress
- spec:
- selector:
- app: wordpress
- type: NodePort #为node节点配置端口映射
- ports:
- - port:
- targetPort:
- nodePort:
[root@docker-server1 svcs]# kubectl apply -f wordpress-svc.yaml
[root@docker-server1 svcs]# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- kubernetes ClusterIP 10.96.0.1 <none> /TCP 11h
- mysql-svc ClusterIP 10.96.240.104 <none> /TCP 16m
- wordpress NodePort 10.96.72.115 <none> :/TCP 2s
[root@docker-server1 svcs]# netstat -ntlp|grep 32080
2.6 查看详细信息
[root@docker-server1 ~]# kubectl describe svc mysql-svc
- Name: mysql-svc
- Namespace: default
- Labels: <none>
- Annotations: <none>
- Selector: app=mysql
- Type: ClusterIP
- IP: 10.96.240.104
- Port: <unset> /TCP
- TargetPort: /TCP
- Endpoints: 10.244.1.22:
- Session Affinity: None
- Events: <none>
[root@docker-server1 ~]# kubectl describe svc wordpress
- Name: wordpress
- Namespace: default
- Labels: <none>
- Annotations: kubectl.kubernetes.io/last-applied-configuration:
- {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"wordpress","namespace":"default"},"spec":{"ports":[{"nodePort":...
- Selector: app=wordpress
- Type: NodePort
- IP: 10.96.72.115
- Port: <unset> /TCP
- TargetPort: /TCP
- NodePort: <unset> /TCP
- Endpoints: 10.244.0.6:
- Session Affinity: None
- External Traffic Policy: Cluster
- Events: <none>
2.7 查看iptables
[root@docker-server1 ~]# iptables -t nat -L|grep 32080
- KUBE-MARK-MASQ tcp -- anywhere anywhere /* default/wordpress: */ tcp dpt:
- KUBE-SVC-2T26TNVTRAU2MSW5 tcp -- anywhere anywhere /* default/wordpress: */ tcp dpt:
[root@docker-server1 ~]# iptables -t nat -L
- KUBE-MARK-MASQ tcp -- !docker-server1/ 10.96.240.104 /* default/mysql-svc: cluster IP */ tcp dpt:mysql
- KUBE-SVC-USVAXDL4J4VMVCQU tcp -- anywhere 10.96.240.104 /* default/mysql-svc: cluster IP */ tcp dpt:mysql
- KUBE-MARK-MASQ tcp -- !docker-server1/ 10.96.72.115 /* default/wordpress: cluster IP */ tcp dpt:http
- KUBE-SVC-2T26TNVTRAU2MSW5 tcp -- anywhere 10.96.72.115 /* default/wordpress: cluster IP */ tcp dpt:http
- KUBE-MARK-MASQ udp -- !docker-server1/ 10.96.0.10 /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain
- KUBE-SVC-TCOU7JCQXEZGVUNU udp -- anywhere 10.96.0.10 /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain
- KUBE-MARK-MASQ tcp -- !docker-server1/ 10.96.0.10 /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
- KUBE-SVC-ERIFXISQEP7F7OF4 tcp -- anywhere 10.96.0.10 /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
- KUBE-MARK-MASQ tcp -- !docker-server1/ 10.96.0.10 /* kube-system/kube-dns:metrics cluster IP */ tcp dpt:
- KUBE-SVC-JD5MR3NA4I4DYORP tcp -- anywhere 10.96.0.10 /* kube-system/kube-dns:metrics cluster IP */ tcp dpt:
- KUBE-MARK-MASQ tcp -- !docker-server1/ 10.96.93.119 /* kubernetes-dashboard/dashboard-metrics-scraper: cluster IP */ tcp dpt:irdmi
- KUBE-SVC-NDSMHFCKXJRPU4FV tcp -- anywhere 10.96.93.119 /* kubernetes-dashboard/dashboard-metrics-scraper: cluster IP */ tcp dpt:irdmi
- KUBE-MARK-MASQ tcp -- !docker-server1/ 10.96.87.98 /* kubernetes-dashboard/kubernetes-dashboard: cluster IP */ tcp dpt:https
- KUBE-SVC-4CRUJHTV5RT5YMFY tcp -- anywhere 10.96.87.98 /* kubernetes-dashboard/kubernetes-dashboard: cluster IP */ tcp dpt:https
- KUBE-MARK-MASQ tcp -- !docker-server1/ 10.96.0.1 /* default/kubernetes:https cluster IP */ tcp dpt:https
2.8 外部配置wordpress
访问:http://192.168.132.131:32080
选择简体中文
配置邮件
登录
输入用户名密码
最终界面
配置完成
博主声明:本文的内容来源主要来自誉天教育晏威老师,由本人实验完成操作验证,需要的博友请联系誉天教育(http://www.yutianedu.com/),获得官方同意或者晏老师(https://www.cnblogs.com/breezey/)本人同意即可转载,谢谢!
006.kubernets之Deployment简单部署的更多相关文章
- kubernets之Deployment资源
一 声明式的升级应用 1.1 回顾一下kubernets集群里面部署一个应用的形态应该是什么样子的,通过一副简单的图来描述一下 通过RC或者RS里面的模板创建了三个pod,之后通过一个servci ...
- XenApp简单部署
作者:MR.Yangwj 目录 XenApp简单部署... 1 一. XenApp安装... 1 (一) 服务器配置任务... 9 1) 许可证服务器配置... 9 ...
- mongodb 简单部署方案及实例
mongodb 简单部署方案及实例 转载:http://my.oschina.net/zhuzhu0129/blog/53290 第一节 准备工作 一 安装mongodb 我这里选用rehl 5.6 ...
- Glue4Net简单部署基于win服务的Socket程序
smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...
- SQL Server中的变更捕获技术--简单部署
------准备------ CREATE DATABASE db_test_cdc ,) ,name )); INSERT INTO t1(name)VALUES('test') ------开始- ...
- Tomcat_记一次tomcatwar包应用简单部署过程
记一次tomcat war包应用简单部署过程 by:授客 QQ:1033553122 1. 实践环境 Linux apache-tomcat-7.0.73 2. 实践步骤 # 解压tomcat压缩 ...
- Ceph分布式存储-原理介绍及简单部署
1)Ceph简单概述Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目.Ceph源码下载:http://ceph.com/download/.随着云计算的发 ...
- IntelliJ IDEA 14.1.4导入项目启动报错:Error during artifact deployment.[组件部署期间出错]
1.问题描述:Error during artifact deployment.[组件部署期间出错] 2.删除Artifacts 3.刷新 4.重新生成Artifacts 5.重新选择 再重新启动项目 ...
- WebStorm 简单部署服务器进行测试操作
WebStorm 简单部署服务器对外发布接口 第一步: 查看webstorm防火墙是否允许链接,控制面板-->防火墙-->高级设置 入站规则-->webstrom是否允许链接 ,双击 ...
随机推荐
- 【原生JS】图片预加载之无序预加载
图片预加载之无序预加载 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...
- 2006年NOIP普及组复赛题解
题目涉及算法: 明明的随机数:简单模拟: 开心的金明:01背包: Jam的计数法:模拟: 数列:二进制. 明明的随机数 题目链接:https://www.luogu.org/problem/P1059 ...
- 【知识小结】PHP使用svn笔记总结
在公司里,我们要养成每天上班前更新代码,下班前提交代码的习惯,并且做好说明. svn更新代码的时候,先右键点击需要更新的项目,在team中进入资源库同步界面,选择incoming mode,显示的文件 ...
- Python--day48--ORM框架SQLAlchemy操作表
ORM框架SQLAlchemy操作表: 表结构和数据库连接: #!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy.ext.decl ...
- Java5新特性对数组的支持
增强for循环 → for-each for (参数类型参数名 : 数组名) { 代码块 } Eg: package reviewDemo; public class Demo6 { public s ...
- liunx重定向控制台消息
Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一 ...
- python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...
- Jmeter配置元件——CSV DataSet Config参数化
在聊CSV DataSet Config配置元件前,先来讨论下为何要参数化? 比如在做性能测试过程中, 一般我们需要模拟多个用户进行操作, 为了满足实际场景, 模拟真实的用户行为, 我们需要做到模拟的 ...
- SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub
GitHub第三方授权登录 使用SPA+.NET Core3.1实现 GitHub第三方授权登录 类似使用AspNet.Security.OAuth.GitHub,前端使用如下:VUE+Vue-Rou ...
- ES安装&常见错误
ES常见错误 案例一 [2018-06-20T02:35:47,152][INFO ][o.e.b.BootstrapChecks ] [SUcoFrg] bound or publishing to ...