续前K8S搭建集群搭建管理

Yaml格式批量管理集群

Node的隔离与恢复

[[email protected] ~]# kubectl get node

 

续前K8S搭建集群搭建管理

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

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

 

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理

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

[[email protected] ~]# kubectl cordon node2.localdomain

续前K8S搭建集群搭建管理

[[email protected] ~]# kubectl uncordon node2.localdomain

续前K8S搭建集群搭建管理

 

Node扩容

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

Yum install -y kubectl kubeadm docker-ce

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

Namespace命名空间划分分组

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

Kubrenetes资源管理

续前K8S搭建集群搭建管理

POD容器的requests和limits

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理

[[email protected] /]# 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>

 

 

[[email protected] /]# 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

[[email protected] /]#

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

 

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

 [[email protected] /]# 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)

[[email protected] /]#

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

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

 

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

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

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

Yaml格式创建容器

通过命令查看pod的yaml格式

[[email protected] ~]# 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://[email protected]: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"

[[email protected] ~]# 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

[[email protected] ~]

 

 

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的资源清单怎么定义

[[email protected] ~]# 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

 

[[email protected] ~]#

metadata怎么定义

[[email protected] ~]# kubectl explain pods.metadata

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

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

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

或者按下图写法也可以

续前K8S搭建集群搭建管理

然后根据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.

[[email protected] ~]# kubectl create -f dameon.yaml

pod/pod-dameon created

[[email protected] ~]#

续前K8S搭建集群搭建管理

 

[[email protected] ~]# kubectl describe pods pod-dameon

查看描述对pod的

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

[[email protected] ~]# 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" "-"

[[email protected] ~]# curl 10.244.3.12

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

[[email protected] ~]#

 

 

[[email protected] ~]# kubectl logs pod-dameon busybox

[[email protected] ~]# 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.

[[email protected] ~]#

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

续前K8S搭建集群搭建管理

命令进入交互式

[[email protected] ~]# kubectl exec -it pod-dameon -c myapp -- /bin/sh

/ #

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

显示标签及标签值命令

[[email protected] ~]# kubectl get pods -l app --show-labels

NAME         READY   STATUS    RESTARTS   AGE   LABELS

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

[[email protected] ~]#

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

[[email protected] ~]# kubectl label pods pod-dameon tier=stable

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

[[email protected] ~]# kubectl label pods pod-dameon tier=stable --overwrite

pod/pod-dameon labeled

 [[email protected] ~]# kubectl get pods -l app --show-labels

NAME         READY   STATUS    RESTARTS   AGE   LABELS

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

[[email protected] ~]#

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

[[email protected] ~]# 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

[[email protected] ~]# kubectl get pods -l "tier in (false,stable,myapp)"

NAME         READY   STATUS    RESTARTS   AGE

pod-dameon   2/2     Running   16         16h

[[email protected] ~]#

[[email protected] ~]# kubectl get pods -l "tier notin (false,stable,myapp)"

NAME                     READY   STATUS             RESTARTS   AGE

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

[[email protected] ~]#

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

matchLabels:直接给定键值

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

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

操作符:

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

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

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

[[email protected] ~]# kubectl label nodes node3.localdomain cpu=4

node/node3.localdomain labeled

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

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

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

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

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

如下图:

续前K8S搭建集群搭建管理

 

annotations:

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

Pod是有生命周期的:

初始化容器

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

创建pod: scheduler  api-server etcd 

续前K8S搭建集群搭建管理

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

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

 

重启策略:

restartPolicy:

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

 

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

探针类型有三种:

ExecAction,TCPSocketAction,HTTPGetAction

 

如图:

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理

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

 

续前K8S搭建集群搭建管理

 

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

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

如下图是否reday状态

 

续前K8S搭建集群搭建管理

 

默认检测三次  每次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:可以安装大多数应用

 

续前K8S搭建集群搭建管理

 

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

续前K8S搭建集群搭建管理

 

上图是deployment的yaml文件

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

续前K8S搭建集群搭建管理

然后获取下deploy 和rs  

为了体现滚动更新的状态把版本更改成V2如图续前K8S搭建集群搭建管理

在此使用kubectl apply -f dameon.yaml

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

续前K8S搭建集群搭建管理

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

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

续前K8S搭建集群搭建管理

Available Commands:

  history     显示 rollout 历史

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

  resume      继续一个停止的 resource

  status      显示 rollout 的状态

  undo        撤销上一次的 rollout

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

续前K8S搭建集群搭建管理

上图是通过命令形式,打补丁 更改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 来实时监控资源更新状况

续前K8S搭建集群搭建管理

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

Kubectl rollout status deployment myapp-deploy

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理

 

DemonSet:无状态 守护进程类型

续前K8S搭建集群搭建管理

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

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

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理

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

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

配置service暴露端口

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

Kubectl expose deployment redis --port=6379

续前K8S搭建集群搭建管理

 

 

 

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

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

解析依赖于CoreDNS

Service 调度类型代理模式:

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

这种转发类型效率低

续前K8S搭建集群搭建管理

第二种类型:

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

效率更高些

续前K8S搭建集群搭建管理

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

续前K8S搭建集群搭建管理

续前K8S搭建集群搭建管理

使用资源清单创建service

[[email protected] ~]# 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

续前K8S搭建集群搭建管理

第二种NodePort类型

续前K8S搭建集群搭建管理

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

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

续前K8S搭建集群搭建管理

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

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

特点二级转发

续前K8S搭建集群搭建管理

 

第四种

ExternalName 集群外部映射到pod

续前K8S搭建集群搭建管理

 

Kubernetes ingress 和ingress controller

下图即是特殊的一种controller

续前K8S搭建集群搭建管理

 

续前K8S搭建集群搭建管理

 

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

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

续前K8S搭建集群搭建管理

部署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 一次部署其它的命名。

续前K8S搭建集群搭建管理

定义ingress

Kubectl explain ingress.spec

Mkdir /ingress

定义一个service   deployment

或则直接安装mandatory.yaml