说下K8S中的一些基础概念

首先是K8S中的一个概念,Deployment

如果想要在K8S中 ,进行一个创建一个单体应用

我们可以使用两种方式

Kubectl run nginx –image=nginx

kubectl create deployment my-nginx –image=nginx

两者的区别在于,对于run,其实创建的是一个pod

Create的则是一个deployment

我们在K8S中,通过发布Deployment,可以创建应用程序实例,放在一个Pod上,Pod则是K8S中最小的管理单元,之后会讲

创建完成Pod之后,Kubernetes Deployment Controller会持续监控这些实例,如果出现了实例故障,监视的Controller会将其再次调度并部署

因此,K8S的deployment具有自愈的功能

其次是Pod这个概念

K8S的一个抽象概念,存放一组container,以及container的共享资源,包括

共享存储,volumes

网络,每个Pod中具有一个唯一IP

所以,如果多个容器具有紧密耦合的关系,需要共享磁盘等资源,则应该部署在一个Pod中

图片

除了Pod和Node之外,Kubernetes还有者一个核心的概念,即为namespace

是一种虚拟的概念,和实际存在的Node不同,是方便用户管理Pod或者Deployment的一种虚拟概念

之后是Kubenetes的一些基本操作

简单的是 get 命令,用于获取不同的资源类型

比如 kubectl get deployments

Kubectl get pods

Kubectl get nodes

其中可以添加的后缀有

Kubectl get deployments -A 获取所有空间的

Kubectl get deployments –all-namespace

kubectl get deployments -n kube-system

对于get可以获得资源

可以利用kubectl api-resources

可以加的后缀是–namespaced=true来进行查看

kubectl api-resources –namespaced=true

kubectl describe 获取资源的详细信息

kubectl describe deployment my-nginx

kubectl describe pod nginx-XXXXXX

kubectl logs Pod

kubectl logs -f nginx -pod-xxxx

查看对应的Pod的输出日志

以及kubectl exec 类似docker的exec命令

Kubectl exec Pod名称

Kubectl exec -it nginx-pod-xxx /bin.bash

用于进入一个Pod之中

之后我们将会讲解一下Kubernetes如何进行应用的抽象和封装

在此之前,我们先说其中一个重要的命令

Scale命令

首先是 –replicas 说明要指定包含多少个Pod

之后指定资源类别

kubectl scale –replicas=3  deployment tomcat6

然后是Kubernetes的应用暴露概念

我们可以将一个deployment中生命包含多个相同

然后,暴露一个统一的对外入口,然后由K8S来负责进行实际的跳转交付

这一点利用的命令是expose,例如

kubectl expose deployment tomcat6 –port=8912 –target-port=8080 –type=NodePort

其中,port是入口端口,负责用于暴露

Target-port是要跳转的目标Pod的端口

Type中可以指定clusterIp,暴露一个IP,负责进行负载均衡

这个IP范围,是我们在kubeadm init时候指定的网络范围

当选择type为 NodePort的时候,会暴露一个宿主机上的端口

比如我们 34303:8888

那么其实本质上一个Service 就是利用Label进行了管理

一个Service明白自己所需要管理的Pod对应的Label,然后利用不同的方式暴露自己的IP或者端口,然后进行相关的测试匹配

Service的选择是利用对应的选择器

[标签(Label)和选择器(Selector)](https://kubernetes.io/zh/docs/concepts/overview/working-

with-objects/labels)

然后我们展示一下K8S的滚动升级方式

滚动更新允许通过使用新的实例逐步更新 Pod 实例从而实现 Deployments 更新,停机时间为零

对应的代码为

Kubectl set image deployment.apps/tomcat6 tomcat=tomcat:jre8-alpine

#可以设置携带—record参数,记录变更

回滚升级

Kubectl rollout history deployment.app/tomcat6

回滚到指定版本

Kubectl rollout undo deployment.app/tomcat6 –to-revision=1

其实除了命令行使用K8S之外,K8S更加推荐使用声明式API

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: 1   #使用该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端口可访问

接下来我们将这个yaml放在宿主机上,xxx.yaml,并进行应用

kubectl apply -f xxx.yaml

对于应用的暴露

只需要类似的命令式声明,在Service中的metadata中修改

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

对于其他我们上述说的命令行操作,都可以在yaml中操作实现

比如扩缩容, 修改对应对象中的replicas即可

滚动升级也是

修改imageName属性等,也是kubectl apply -f xxx.yaml

之后部署dashboard

直接使用https://github.com/kubernetes/dashboard中的yaml部署即可

然后需要设置其中Service的暴露方式为 NodePort,方便使用

之后每次访问的时候需要输如令牌

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk ‘{print $1}’)

最后我们说下K8S中的kubectl和kubelet

kubeadm 负责安装的集群,后来是yum install etcd api-server

安装完成后,核心文件在于 /etc/Kubernetes,以Pod方式安装的核心组件

其中有,etcd api-server,scheduler等Pod的yaml文件

对于这些Pod,标记为集群的静态Pod,是不可以修改的

发表评论

邮箱地址不会被公开。 必填项已用*标注