接前一篇文章:Kubernetes的基础与安装
K8s的常用命令:
# 原生命令行 kubectl create 资源 #创建任意资源 kubectl create deploy #创建部署 kubectl run #只创建一个Pod,由于没有创建部署,所以没有自愈能力 kubectl get 资源名(node/pod/deploy) -n xxx(指定名称空间,默认是default) #获取资源 kubectl describe 资源名(node/pod/deploy) xxx #描述某个资源的详细信息 kubectl logs 资源名 ##查看日志 kubectl exec -it pod名 -- 命令 #进pod并执行命令 kubectl delete 资源名(node/pod/deploy) xxx #删除资源 ## yaml文件 #1、部署 kubectl apply -f deployment.yaml #2、移除 kubectl delete -f deployment.yaml #3、对比差异 kubectl diff -f deployment.yaml #4、替换对象 kubectl replace -f nginx.yaml ### 三个命令玩转所有yaml的写法 kubectl explain pod.spec.xx #解释字段 kubectl get xx -oyaml #yaml格式获取资源 kubectl create deploy xxxx --dry-run=client -oyaml #干运行并yaml输出
一、K8s的常见功能
1、K8s的手动扩缩容
将my-nginx的副本数从1扩到3,再从3降到2:
[root@k8s-02 ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 1/1 1 1 118s [root@k8s-02 ~]# kubectl scale --replicas=3 deploy my-nginx deployment.apps/my-nginx scaled [root@k8s-02 ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 3/3 3 3 3m15s [root@k8s-02 ~]# kubectl scale --replicas=2 deploy my-nginx deployment.apps/my-nginx scaled [root@k8s-02 ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 2/2 2 2 5m34s
2、应用的外部可见
K8s集群采用Service(服务)对外暴露应用 —— 负载均衡服务!
kubectl expose deployment my-nginx --port=8888 --target-port=80 --type=NodePort [root@k8s-02 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 10h my-nginx NodePort 10.1.52.98 <none> 8888:32753/TCP 3m11s ## --port:集群内访问service的端口 8888 ## --target-port: pod容器的端口 80 ## --NodePort: 真正对外暴露的每个机器开发的端口 32753(由K8s自动为我们生成的,不是我们指定的)
我们可以再我们的电脑上,尝试访问这个端口:http://192.168.56.20:32753 或者 http://192.168.56.21:32753 都可以访问:
结合上面讲的动态扩缩容,我们可以快速地实现服务节点的增加,K8s会立即就帮我们实现负载均衡!很很爽!
, 它们是允许对 Kubernetes 中的对象进行逻辑操作的一种分组原语。标签(Label)是附加在对象上的键/值对,可以以多种方式使用:(给所有的资源都可以打标签kubectl label……)
指定用于开发,测试和生产的对象
嵌入版本标签
所以,其实,即使我们上面以为使用的my-nginx是部署名,其实不然,使用的是一组名为my-nginx的标签而已。(K8s为部署创建的pod自动打上部署名的标签)
[root@k8s-02 ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS my-nginx-6b74b79f57-7d758 1/1 Running 0 28m app=my-nginx,pod-template-hash=6b74b79f57 my-nginx-6b74b79f57-8sp94 1/1 Running 0 26m app=my-nginx,pod-template-hash=6b74b79f57
3、滚动升级(原生支持灰度发布)
在没有K8s滚动升级之前,每一次升级都可能是一次灾难,因为机器要停,如果我们把之前的包删除了,然后新的包又没有成功,那可就麻烦了!
滚动更新允许通过使用新的实例逐步更新 Pod 实例从而实现 Deployments 更新,停机时间为零。
与应用程序扩展类似,如果暴露了 Deployment,服务(Service)将在更新期间仅对可用的 pod 进行负载均衡。可用 Pod 是应用程序用户可用的实例。
滚动更新允许以下操作:
– 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
– 回滚到以前的版本
– 持续集成和持续交付应用程序,无需停机
#应用升级: tomcat:alpine、tomcat:jre8-alpine # kubectl set image deployment/my-nginx2 nginx=nginx:1.9.1 ##联合jenkins 形成持续集成,灰度发布功能 kubectl set image deployment.apps/tomcat6 tomcat=tomcat:jre8-alpine #可以携带--record参数,记录变更 ##回滚升级 ### 查看历史记录 kubectl rollout history deployment.apps/tomcat6 kubectl rollout history deploy tomcat6 deployment.apps/my-nginx REVISION CHANGE-CAUSE 1 <none> ### 回滚到指定版本 kubectl rollout undo deployment.apps/tomcat6 --to-revision=1 kubectl rollout undo deploy tomcat6 --to-revision=1
二、K8s的对象描述文件
1、为什么要有对象描述文件?
-
我们在开发中,每次都敲命令,很麻烦,也很容易出错;
-
在项目中,我们可以提前准备一个描述文件,上线时候,直接deploy,而不是上线时候还在桥命令;
用文件的方式,固化操作,移植性大大增强!
kubectl apply -f xxx.yaml .
2、Demo——创建一次Nginx的部署
创建一个deploy.yaml文件:
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本 kind: Deployment #该配置的类型,我们使用的是 Deployment metadata: #译名为元数据,即 Deployment 的一些基本属性和信息 name: nginx-deployment #Deployment 的名称 labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解 app: nginx #为该Deployment设置key为app,value为nginx的标签 spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用 replicas: 3 #使用该Deployment创建一个应用程序实例 selector: #标签选择器,与上面的标签共同作用,目前不需要理解 matchLabels: #选择包含标签app:nginx的资源 app: nginx template: #这是选择或创建的Pod的模板 metadata: #Pod的元数据 labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod app: nginx spec: #期望Pod实现的功能(即在pod中部署) containers: #生成container,与docker中的container是同一种 - name: nginx #container的名称 image: nginx:1.7.9 #使用镜像nginx:1.7.9创建container,该container默认80端口可访问
执行应用文件:
[root@k8s-02 ~]# kubectl apply -f deploy.yaml deployment.apps/nginx-deployment created
如果我们需要扩缩容,就直接修改 deploy.yaml 文件里面的副本数量,然后再次 apply 应用即可。
滚动升级的演示也一样,可以改一下nginx的版本,即可看到效果!
如果我们想动态的观察某个指令的运行情况,可以使用watch命令:
watch -n 1 kubectl get all
如果想删除由这个文件生成的所有资源,可以直接借助次文件来完成:
kubectl delete -f deploy.yaml
3、Demo——暴露应用
创建一个 service.yaml 文件:
apiVersion: v1 kind: Service metadata: name: nginx-service #Service 的名称 labels: #Service 自己的标签 app: nginx #为该 Service 设置 key 为 app,value 为 nginx 的标签 spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问 selector: #标签选择器 app: nginx #选择包含标签 app:nginx 的 Pod ports: - name: nginx-port #端口的名字 protocol: TCP #协议类型 TCP/UDP port: 80 #集群内的其他容器组可通过 80 端口访问 Service nodePort: 32600 #通过任意节点的 32600 端口访问 Service targetPort: 80 #将请求转发到匹配 Pod 的 80 端口 type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
执行应用文件:
[root@k8s-02 ~]# kubectl apply -f service.yaml service/nginx-service created
之后我们的服务就可以创建了,为了省事,我们也可以经常直接kubectl get all
[root@k8s-02 ~]# kubectl get all NAME READY STATUS RESTARTS AGE pod/nginx-deployment-7cf7d6dbc8-c9n6g 1/1 Running 0 7m37s pod/nginx-deployment-7cf7d6dbc8-zllm4 1/1 Running 0 7m35s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 11h service/nginx-service NodePort 10.1.17.16 <none> 80:32600/TCP 2m25s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 2/2 2 2 14m NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-746fbb99df 0 0 0 14m replicaset.apps/nginx-deployment-7cf7d6dbc8 2 2 2 7m37s
三、对象描述文件yaml详解
1、集群中的资源达到最终一致
可以以yaml的格式输出一个对象(node、service、deployment、pod):
kubectl get pod nginx-deployment-7cf7d6dbc8-zllm4 -oyaml # 输出结果 apiVersion: v1 kind: Pod metadata: spec: #期望状态,我们程序员编写yaml时候的重点 status: #当前状态
k8s集群中的最终一致性特点,会使得status最终与spec一样,这样集群就达到了我们预期的效果;
如果由节点宕机,status又会和spec不一致,K8s就会继续工作!
2、yaml编写小窍门
-
可以通过启动一个相同类型的资源,然后将它输出为yaml格式,取其中不含status(当前状态)的部分:
## kubectl run my-nginx666 --image=nginx #启动一个Pod ## 1、kubectl get pod my-nginx666 -oyaml 集群中挑一个同类资源,获取出他的yaml。
-
干跑一边创建资源的命令,并直接输出为yaml:
## 2、kubectl run my-tomcat --image=tomcat --dry-run -oyaml 干跑一遍 kind: Pod #资源类型 kubectl api-resources:可以获取到所有资源 apiVersion: v1 #同一个资源有可能有多个版本。看 kubectl api-resources提示的。 metadata: #每一个资源定义一些元数据信息 labels: run: my-tomcat name: my-tomcat spec: #资源的期望规格(镜像名、镜像的环境变量信息等等) containers: - image: tomcat name: my-tomcat resources: {} dnsPolicy: ClusterFirst restartPolicy: Always
四、为Vscode安装插件
1、yaml语法插件(YAML)
2、K8s的模板插件(Kubernetes Templates)
3、编写插件的使用
牛逼!