Yaml格式批量管理集群

Node的隔离与恢复

[root@master ~]# kubectl get node

 

通过获取的node的名称通过kubectl patch 把节点取消调度范围,以达到在调度pod时候不会向该节点发送调度消息。

[root@master ~]# kubectl patch node node3.localdomain -p '{"spec":{"unschedulable":true}}'

 

而恢复调度与上面命令相反即可

另外,kubectl子命令cordon和uncordon也可用于实现将node进行隔离和恢复调度的操作。

[root@master ~]# kubectl cordon node2.localdomain

[root@master ~]# kubectl uncordon node2.localdomain

 

Node扩容

扩容方法就是新节点安装node需要的安装包

Yum install -y kubectl kubeadm docker-ce

然后把其它的kube-proxy 以docker镜像的方式在容器中运行

Namespace命名空间划分分组

命名空间的作用就好比公司里开发组跟运维组,开发组需要在集群中不断的创建修改删除各种pod RC service 等资源对象,以便实现敏捷的开发过程。而生产运维需要严格的权限设置来保证生产系统中的POD RC SERVCIE 处于正长的工作状态。

Kubrenetes资源管理

POD容器的requests和limits

  1. cpu的requests和limits是通过cpu数来度量的。
  2. 内存的requests和limists计量单位是字节数。

[root@master /]# kubectl get pods -n kube-system -o wide

-n 是指定命名空间   

NAME                                         READY   STATUS    RESTARTS   AGE     IP           NODE                 NOMINATED NODE   READINESS GATES

coredns-86c58d9df4-2dvfl                     1/1     Running   2          6d2h    10.244.0.8   master.localdomain   <none>           <none>

coredns-86c58d9df4-5t9p6                     1/1     Running   2          6d2h    10.244.0.7   master.localdomain   <none>           <none>

etcd-master.localdomain                      1/1     Running   3          6d2h    10.80.2.90   master.localdomain   <none>           <none>

kube-apiserver-master.localdomain            1/1     Running   3          6d2h    10.80.2.90   master.localdomain   <none>           <none>

kube-controller-manager-master.localdomain   1/1     Running   6          6d2h    10.80.2.90   master.localdomain   <none>           <none>

kube-flannel-ds-amd64-5kmqb                  1/1     Running   2          6d      10.80.2.90   master.localdomain   <none>           <none>

kube-flannel-ds-amd64-8prsw                  1/1     Running   2          5d19h   10.80.2.92   node2.localdomain    <none>           <none>

kube-flannel-ds-amd64-rgmzd                  1/1     Running   3          4d      10.80.2.93   node3.localdomain    <none>           <none>

kube-flannel-ds-amd64-t5zm9                  1/1     Running   3          5d20h   10.80.2.91   node1.localdomain    <none>           <none>

kube-proxy-g2c6v                             1/1     Running   3          6d2h    10.80.2.90   master.localdomain   <none>           <none>

kube-proxy-kcdgv                             1/1     Running   2          5d20h   10.80.2.91   node1.localdomain    <none>           <none>

kube-proxy-mf4mq                             1/1     Running   2          5d19h   10.80.2.92   node2.localdomain    <none>           <none>

kube-proxy-xrbx6                             1/1     Running   6          4d      10.80.2.93   node3.localdomain    <none>           <none>

kube-scheduler-master.localdomain            1/1     Running   6          6d2h    10.80.2.90   master.localdomain   <none>           <none>

 

 

[root@master /]# kubectl get svc -n kube-system

NAME       TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE

kube-dns   ClusterIP   10.240.0.10   <none>        53/UDP,53/TCP   6d2h

[root@master /]#

获取service 命名空间  系统的信息

 

安装一个客户端client 竟像是busybox

 [root@master /]# kubectl run client --image=busybox --replicas=1 -it --restart=Never

If you don't see a command prompt, try pressing enter.

/ # cat /etc/resolv.conf 查看解析记录  又一个特殊的域名来解析nameserver

nameserver 10.240.0.10

search default.svc.cluster.local svc.cluster.local cluster.local localdomain

options ndots:5

/ # exit

pod default/client terminated (Error)

[root@master /]#

[root@master /]# dig -t A nginx-service.default.svc.cluster.local @10.240.0.10

Dig解析svc 的名称nginx-servcie 指定 所在的域名来解析到 集群IP如图:

 

综上 通过pod里自带的/etc/resolv.conf 的A记录来解析到几群的IP地址。

Iptables -nvL -t nat  查看网络地址转换情况  

Yaml格式创建容器

通过命令查看pod的yaml格式

[root@master ~]# kubectl get pod nginx-8945c5c8f-hnphf -o yaml

apiVersion: v1

kind: Pod

metadata:

  creationTimestamp: "2019-01-27T00:28:50Z"

  deletionGracePeriodSeconds: 30

  deletionTimestamp: "2019-01-28T01:53:16Z"

  generateName: nginx-8945c5c8f-

  labels:

    app: nginx

    pod-template-hash: 8945c5c8f

  name: nginx-8945c5c8f-hnphf

  namespace: default

  ownerReferences:

  - apiVersion: apps/v1

    blockOwnerDeletion: true

    controller: true

    kind: ReplicaSet

    name: nginx-8945c5c8f

    uid: 845281b6-21ca-11e9-aa5a-000c29a488d1

  resourceVersion: "765219"

  selfLink: /api/v1/namespaces/default/pods/nginx-8945c5c8f-hnphf

  uid: 84919cca-21ca-11e9-aa5a-000c29a488d1

spec:

  containers:

  - image: nginx

    imagePullPolicy: IfNotPresent

    name: nginx

    resources: {}

    terminationMessagePath: /dev/termination-log

    terminationMessagePolicy: File

    volumeMounts:

    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount

      name: default-token-rb42n

      readOnly: true

  dnsPolicy: ClusterFirst

  enableServiceLinks: true

  nodeName: node1.localdomain

  priority: 0

  restartPolicy: Always

  schedulerName: default-scheduler

  securityContext: {}

  serviceAccount: default

  serviceAccountName: default

  terminationGracePeriodSeconds: 30

  tolerations:

  - effect: NoExecute

    key: node.kubernetes.io/not-ready

    operator: Exists

    tolerationSeconds: 300

  - effect: NoExecute

    key: node.kubernetes.io/unreachable

    operator: Exists

    tolerationSeconds: 300

  volumes:

  - name: default-token-rb42n

    secret:

      defaultMode: 420

      secretName: default-token-rb42n

status:

  conditions:

  - lastProbeTime: null

    lastTransitionTime: "2019-01-27T00:28:25Z"

    status: "True"

    type: Initialized

  - lastProbeTime: null

    lastTransitionTime: "2019-01-27T00:31:01Z"

    status: "False"

    type: Ready

  - lastProbeTime: null

    lastTransitionTime: "2019-01-27T00:31:01Z"

    status: "True"

    type: ContainersReady

  - lastProbeTime: null

    lastTransitionTime: "2019-01-27T00:28:51Z"

    status: "True"

    type: PodScheduled

  containerStatuses:

  - containerID: docker://57b4003140ffa5a2bca30bca53e25428983ab2ac577e8181c310aea6d3bb9fa1

    image: nginx:latest

    imageID: docker-pullable://nginx@sha256:56bcd35e8433343dbae0484ed5b740843dd8bff9479400990f251c13bbb94763

    lastState: {}

    name: nginx

    ready: true

    restartCount: 0

    state:

      running:

        startedAt: "2019-01-27T00:31:00Z"

  hostIP: 10.80.2.91

  phase: Running

  podIP: 10.244.1.10

  qosClass: BestEffort

  startTime: "2019-01-27T00:28:25Z"

[root@master ~]# kubectl api-versions api版本分组进行管理

admissionregistration.k8s.io/v1beta1

apiextensions.k8s.io/v1beta1

apiregistration.k8s.io/v1

apiregistration.k8s.io/v1beta1

apps/v1

apps/v1beta1

apps/v1beta2

authentication.k8s.io/v1

authentication.k8s.io/v1beta1

authorization.k8s.io/v1

authorization.k8s.io/v1beta1

autoscaling/v1

autoscaling/v2beta1

autoscaling/v2beta2

batch/v1

batch/v1beta1

certificates.k8s.io/v1beta1

coordination.k8s.io/v1beta1

events.k8s.io/v1beta1

extensions/v1beta1

networking.k8s.io/v1

policy/v1beta1

rbac.authorization.k8s.io/v1

rbac.authorization.k8s.io/v1beta1

scheduling.k8s.io/v1beta1

storage.k8s.io/v1

storage.k8s.io/v1beta1

v1

[root@master ~]

 

 

yaml格式如何定义:

创建资源的方法:  apiserver 紧接受JSON格式的资源定义;

Yaml格式提供配置清单,apiserver可自动装换位json格式,再提交。

大部分资源的配置清单都有五个组建组成;

apiVersion: group/version  一级字段

Kind:资源类别

metadata:元数据

name

 

namespace

labels

annotations

每个资源的用用PATH

       /api/GROUP/VERSION/namespaces/NAMESPACE/TYPE/NAME 大写为名字

spec: 期望状态

spec.containers <[ ]object>

  • name <string>
  • image <string>  顶级仓库镜像  私有镜像

imagePullPolicy   (Always,Never,IfNortPresent)

status: (只读) 当前状态,本字段由kubernetes集群维护,

pod的资源清单怎么定义

[root@master ~]# kubectl explain pod

KIND:     Pod

VERSION:  v1

 

DESCRIPTION:

     Pod is a collection of containers that can run on a host. This resource is

     created by clients and scheduled onto hosts.

 

FIELDS:

   apiVersion       <string>

     APIVersion defines the versioned schema of this representation of an

     object. Servers should convert recognized schemas to the latest internal

     value, and may reject unrecognized values. More info:

     https://git.k8s.io/community/contributors/devel/api-conventions.md#resources

 

   kind  <string>

     Kind is a string value representing the REST resource this object

     represents. Servers may infer this from the endpoint the client submits

     requests to. Cannot be updated. In CamelCase. More info:

     https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds

 

   metadata  <Object>

     Standard object's metadata. More info:

     https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata

 

   spec  <Object>

     Specification of the desired behavior of the pod. More info:

     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

 

   status       <Object>

     Most recently observed status of the pod. This data may not be up to date.

     Populated by the system. Read-only. More info:

     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status

 

[root@master ~]#

metadata怎么定义

[root@master ~]# kubectl explain pods.metadata

如图在定义spec:时候需要docker镜像的具体路径

可以用命令docker search +镜像名称来查找

上边这个图[ ]string  表示的是字符集合  需要用左边两个横线表示

或者按下图写法也可以

然后根据yaml格式文件创建pod

Pod文件内容

apiVersion: v1

kind: Pod

metadata:

  name: pod-dameon

  namespace: default

  labels:

    app: myapp

    tier: front

spec:

  containers:

    - name: myapp

      image: ikubernetes/myapp:v1

    - name: busybox

      image: amd64/busybox:lastest

      command:

      - "/bin/sh"

      - "-c"

      - "echo $(date) >> /usr/share/nginx/html/index.html; sleep 5 "

      上边定义不成功是因为一个pod定义了两个容器,他们是相互隔离的,busybox无法通过命令登录到nginx。                                                       

kubectl create -f dameon.

[root@master ~]# kubectl create -f dameon.yaml

pod/pod-dameon created

[root@master ~]#

 

[root@master ~]# kubectl describe pods pod-dameon

查看描述对pod的

通过获取的上边的信息找到IP地址,访问下用curl在查看访问日志。如下

[root@master ~]# kubectl logs pod-dameon myapp

10.244.0.0 - - [18/Feb/2019:15:02:53 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"

10.244.0.0 - - [18/Feb/2019:15:03:07 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"

[root@master ~]# curl 10.244.3.12

Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

[root@master ~]#

 

 

[root@master ~]# kubectl logs pod-dameon busybox

[root@master ~]# kubectl logs pods pod-dameon busybox

error: expected 'logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]'.

POD or TYPE/NAME is a required argument for the logs command

See 'kubectl logs -h' for help and examples.

[root@master ~]#

提示语法错误,说明容器没有创建成功

命令进入交互式

[root@master ~]# kubectl exec -it pod-dameon -c myapp -- /bin/sh

/ #

显示标签及标签值命令

[root@master ~]# kubectl get pods -l app --show-labels

NAME         READY   STATUS    RESTARTS   AGE   LABELS

pod-dameon   2/2     Running   16         16h   app=myapp,tier=front

[root@master ~]#

修改标签值命令吧tier改成datble

[root@master ~]# kubectl label pods pod-dameon tier=stable

error: 'tier' already has a value (front), and --overwrite is false

[root@master ~]# kubectl label pods pod-dameon tier=stable --overwrite

pod/pod-dameon labeled

 [root@master ~]# kubectl get pods -l app --show-labels

NAME         READY   STATUS    RESTARTS   AGE   LABELS

pod-dameon   2/2     Running   16         16h   app=myapp,tier=stable

[root@master ~]#

标签选择器去选择等着关系和集合关系两种,来筛选出对应的pod

[root@master ~]# kubectl get pods -l tier=stable

NAME         READY   STATUS    RESTARTS   AGE

pod-dameon   2/2     Running   16         16h

其中等值关系有 =,==,!= 

集合关系:

KEY in (VALUE1,VALUE2,…)

KEY notin(VALUE1,VALUE2,……)

KEY

!KEY

[root@master ~]# kubectl get pods -l "tier in (false,stable,myapp)"

NAME         READY   STATUS    RESTARTS   AGE

pod-dameon   2/2     Running   16         16h

[root@master ~]#

[root@master ~]# kubectl get pods -l "tier notin (false,stable,myapp)"

NAME                     READY   STATUS             RESTARTS   AGE

client-58c9b895c-lgxxx   0/1     CrashLoopBackOff   11         33m

[root@master ~]#

许多资源支持内嵌字段定义其使用的标签选择器:

matchLabels:直接给定键值

matchExpressions:基于给定的表达式来定义使用标签选择器,

{key:”KEY”,operator:”OPERATOR”,values:[V1,V2,V3,… ]}

操作符:

In ,Notin:values字段的值必须为非空列表

Exists,NotrExists: values 的字段的值必须为空列表

给节点打标签,及标签选择器

[root@master ~]# kubectl label nodes node3.localdomain cpu=4

node/node3.localdomain labeled

节点打标签,可以更好管理各种配置的节点。

nodeSelector <map[string]string>节点标签选择器 key value 集合

还可以同时限制selector  的nodeName 和nodeSelector 的值来定位node来部署pod

如下图:

 

annotations:

与label不同的地方在于,它不能用于挑选资源对象,紧用于为对象提供“元数据”。

Pod是有生命周期的:

初始化容器

状态:Pending 挂起,Running,Failed,Successed,Unknown.

创建pod: scheduler  api-server etcd 

通过存活性探测来判断容器存活状态:

liveness probe(存活性探测)   readiness probe(就绪性探测)

 

重启策略:

restartPolicy:

Always(总是重启) ,OnFailure(只有出错时候重启) ,Never(不会重启)  默认是always

 

终止信号:发送30秒结束信号,在强制关闭。

探针类型有三种:

ExecAction,TCPSocketAction,HTTPGetAction

 

如图:

接下来是httpGet探针纯活性探针

就绪性探针检测网页可用性:

 

 

然后使用交互式进入pod删除掉索引页

Kubect    exec -it  rediness-httpget-pod -- /bin/sh

如下图是否reday状态

 

 

默认检测三次  每次1秒钟文件中定义

可以用describe查看下pod信息

kubectl describe pods readiness-httpget-pod来显示信息

回顾:pod组成yaml格式文件

apiVersion,kind,metadata,spec,status(只读)

spec:

containers:

nodeSelector

restartPolicy:  Always,Never,OnFailure

   

containers:

  name

  image

  imagePullPolicy: Always Never IfNotPresent

  ports:

       name

       containerPort;

  livenessProbe

  readinessProbe

  lifecycle

ExecAction: exec

TCPSocketAction: tcpScoket

HTTPGetAction: httpget

 

Pod控制器;

   配置清单—apiserver—scheduler—目标节点创建启动pod

三种控制器

ReplicationController:

ReplicaSet:

Deployment:通过控制replicaset来控制pod

DemonSet:无状态 守护进程类型

Job:

Cronjob;

StatefulSet:有状态的 比如装redis mysql 需要数据存储,有状态的运维技能要求很高。

TPR:第三方资源

CDR:custom defined resources, 1.8用户自定义资源。

Operator:

 

Helm(头盔)k8s功能  相当于linux里的yum

Helm:可以安装大多数应用

 

 

如上图Deployment 控制replic set ---pod来达到控制副本数量。

 

上图是deployment的yaml文件

Kubectl apply -f daemon.yaml     apply为声明式创建

然后获取下deploy 和rs  

为了体现滚动更新的状态把版本更改成V2如图

在此使用kubectl apply -f dameon.yaml

然后使用kubectl get pods -l app=myapp -w 一直监控着更新的状态

获取到的rs(replicas Set) 有两个不同版本的,k8s默认支持保存10个版本。

然后通过kubectl rollout history deployment myapp-deploy 可以看滚动历史

Available Commands:

  history     显示 rollout 历史

  pause       标记提供的 resource 为中止状态

  resume      继续一个停止的 resource

  status      显示 rollout 的状态

  undo        撤销上一次的 rollout

使用undo可以回滚到上次的状态。

上图是通过命令形式,打补丁 更改replicas 的附本数量。也可以通过更改yaml文件来进行。

如果是直接更新pod可以通过直接更改yaml文件然后kubectl apply -f 来升级

但是做测试的情况下,在不更改原yaml格式文件的前提下,通过打补丁来临时测试:

Kubectl patch(暂停更新) deployment myapp-deploy -p ‘{“spec”:{“strategy”:{“rollingUpdate”:{“maxSurge”:1,”maxUnavailabe:0”}}}}’

升级也可以通过set image 通过更改镜像版本来达到滚动升级的目的:

Kubectl set image deployment myapp-deploy myapp=kubernetes/nginx:v3 && kubectl rollou pause deployment myapp-deploy

可以通过在master上在打开一个窗口通过命令

Kubectl get pods -l app=myapp -w 来实时监控资源更新状况

或者通过以下命令监视更新过程:

Kubectl rollout status deployment myapp-deploy

然后通过kubectl rollout resume deployment myapp-deploy来继续更新

 

DemonSet:无状态 守护进程类型

无状态守护进程类型的部署器:每个node上只部署运行一个pod副本,类似于监控节点类型的守护进程。然后demonset 可以

Kubectl explain pods.spec.hostNetwork来定义共享node的节点网络来达到,外边的请求可以直接访问此pod。

部署之后可以查看日志信息是否打印:

以上是pod的创建部署管理以及deployment和demonset部署器的配置,接下来是通过

Service 暴露端口配置服务映射到管理的deployment上来达到node端口暴露服务的目的。

配置service暴露端口

首先通过简单的kubectl命令来达到目的:

Kubectl expose deployment redis --port=6379

 

 

 

为了给对应的客户端提供固定的访问端口,所以就产生了中间件service

解析依赖于CoreDNS

Service 调度类型代理模式:

第一种类型:用户—内核空间service IP(iptables)--kube-proxy---内核空间(iptables)service IP—service pod

这种转发类型效率低

第二种类型:

Client pod—serviceIP(iptables)--kube-proxy---service pod

效率更高些

第三种类型:1.11之后用的ipvs,如果未激活会自动降级为iptables

使用资源清单创建service

[root@master ~]# kubectl explain svc

来查看svc怎么定义的

工作模型:userspace iptables ipvs

类型: ExternalName ,ClusterIP,NodePort,and LoadBlance

只有类型是NodePort时候 spec下才能用到nodeport

其中spec下的port是service port   targetPort是pod port

 

Vim redis-svc.yaml

 

apiVersion: v1

kind: Service

metadata:

  name: redis

spec:

  selector:

    app: redis

    role: logstor

  ports:

    name: redis-port

    - port: 6379

      targetPort: 6379

kubectl apply -f redis-svc.yaml 重新定义svc

第二种NodePort类型

Nodeport可以不指定 叫系统自动分配

可以通过命令来测试负载均衡功能 service的

如果是集群内部客户端访问就不需要做端口映射。Nodeport

第三种需要在公有云上才能使用lbaas功能

特点二级转发

 

第四种

ExternalName 集群外部映射到pod

 

Kubernetes ingress 和ingress controller

下图即是特殊的一种controller

 

 

Daemonset  共享宿主机的port  通过污点来识别需要接入外部流量访问。

而daemonset这种反向代理方式在k8s中叫做ingress controller

部署ingress controller

Yum install -y git  可以在gitlab上下载需要的 ingress-controller

创建一个名称空间 kubectl create namespace ingress-nginx

https://github.com/kubernetes/ingress-nginx 可以到网址去下载yaml文件来安装

也可以通过for循环下载到本地,或则git到本地都行。

先创建名称空间

Kubectl apply -f namespace ingress-nginx

然后一次用apply 一次部署其它的命名。

定义ingress

Kubectl explain ingress.spec

Mkdir /ingress

定义一个service   deployment

或则直接安装mandatory.yaml

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐