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
- cpu的requests和limits是通过cpu数来度量的。
- 内存的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