Kubernetes的使用

接前一篇文章: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(服务)对外暴露应用 —— 负载均衡服务!

image.png

 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 都可以访问:

image.png

结合上面讲的动态扩缩容,我们可以快速地实现服务节点的增加,K8s会立即就帮我们实现负载均衡!很很爽!

Service 匹配一组 Pod 是使用 标签(Label)和选择器(Selector), 它们是允许对 Kubernetes 中的对象进行逻辑操作的一种分组原语。标签(Label)是附加在对象上的键/值对,可以以多种方式使用:(给所有的资源都可以打标签kubectl label……)

  • 指定用于开发,测试和生产的对象

  • 嵌入版本标签

  • 使用 Label 将对象进行分类

image.png

所以,其实,即使我们上面以为使用的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 是应用程序用户可用的实例。

滚动更新允许以下操作:

  • – 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)

  • – 回滚到以前的版本

  • – 持续集成和持续交付应用程序,无需停机

image.png

#应用升级: 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)

image.png

2、K8s的模板插件(Kubernetes Templates)

image.png

3、编写插件的使用

image.png

image.png

image.png

牛逼!

jiguiquan@163.com

文章作者信息...

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐