跳到主要内容

31 篇博文 含有标签「技术」

查看所有标签

3. Label与Annotation

· 阅读需 1 分钟

3.1 Label

查看资源的标签信息

kubectl get nodes --show-labels
或者
kubectl describe nodes node01

Label的添加与删除,Key必须存在且唯一,Value可以为空、且不唯一

# 添加Label
kubectl label nodes node01 node-role.kubernetes.io/work=

# 删除Label
kubectl label nodes node01 node-role.kubernetes.io/work-

查看node的角色

kubectl get nodes

3.2 Annotation

查看Annotation

kubectl describe resource_type/resource_name

Annotation的添加与删除,#Key必须存在且唯一,Value可以为空、且不唯一

添加Annotation
kubectl annotate resource_type resource_name key=value

# 删除Annotation
kubectl annotate resource_type resource_name key-

1. 工作负载之Controllers

· 阅读需 5 分钟

1.1 ReplicaSet

1.1.1 创建ReplicaSet

# 创建Yaml文件
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
labels:
app: nginx
spec:
replicas: 6
selector:
matchLabels:
app: pod-nginx
template:
metadata:
labels:
app: pod-nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent

1.1.2 查看ReplicaSet

kubectl get replicasets.apps
DESIRED: 请求的副本数
CURRENT:实际运行的副本数
READY:副本数为READY的数量
AGE:生命周期

1.1.3 调整ReplicaSet副本数

# 方法一:修改本地yaml文件的replicas: 3

# 方法二:编辑已经运行资源的yaml文件
kubectl edit replicaset `<NAME>`

# 方法三:通过命令行
kubectl scale replicaset --replicas=1 `<NAME>`

1.2 Deployment

1.2.1 创建Deployment

# 方法一:命令行创建
kubectl create deployment nginx-app --image=nginx:1.9.0

# 方法二:创建Yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: deployment-nginx
spec:
replicas: 4
selector:
matchLabels:
app: pod-nginx
template:
metadata:
labels:
app: pod-nginx
spec:
containers:
- name: nginx
image: nginx:1.7.6
ports:
- containerPort: 80

1.2.2 查看Deployment

kubectl get deployment
READY:Pod READY的数量
UP-TO-DATE: 升级最新的Pod数量
AVAILABLE:可用的Pod数量
AGE:资源的生命周期

1.2.3 调整ReplicaSet副本数

# 方法一:修改本地yaml文件的replicas: 3

# 方法二:编辑已经运行资源的yaml文件
kubectl edit deployment `<NAME>`

# 方法三:通过命令行
kubectl scale deployment --replicas=1 `<NAME>`

1.2.4 升级image

# 方法一
更改本地yaml,并使用apply升级

# 方法二
使用edit更改运行的Deployment,修改container的image

# 方法三
通过命令行升级并记录升级信息:kubectl set image deployment nginx-deployment nginx=nginx:latest --record
#考试用的命令

# 查看deployment升级的状态
kubectl rollout status deployment nginx-deployment

1.2.5 回滚

# 查看历史记录
kubectl rollout history deployment nginx-deployment

# 查看某一个记录的详细信息
kubectl rollout history deployment nginx-deployment --revision=1

# 执行回滚操作
kubectl rollout undo deployment nginx-deployment --to-revision=1

1.2.6 暂停与恢复

# 暂停部署
kubectl rollout pause deployment nginx-deployment

# 恢复部署
kubectl rollout resume deployment nginx-deployment

1.2.7 重新部署应用

# 重新部署
kubectl rollout restart deployment nginx-deployment

1.3 StatefulSet

1.3.1 创建StatefulSet

# 创建Yaml文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: pod-nginx
serviceName: "nginx"
replicas: 5
template:
metadata:
labels:
app: pod-nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web

1.3.2 查看StatefulSet

kubectl get statefulsets.apps

1.3.3 调整ReplicaSet副本数

# 方法一:修改本地yaml文件的replicas: 3

# 方法二:编辑已经运行资源的yaml文件
kubectl edit statefulset `<NAME>`

# 方法三:通过命令行
kubectl scale statefulset --replicas=1 `<NAME>`

1.3.4 升级image

# 方法一
更改本地yaml,并使用apply升级

# 方法二
使用edit更改运行的statefulset,修改container的image

# 方法三
通过命令行升级并记录升级信息:kubectl set image statefulset web nginx=nginx:latest --record

# 查看deployment升级的状态
kubectl rollout status statefulset web

1.3.5 回滚

# 查看历史记录
kubectl rollout history statefulset web

# StatefulSet不支持查看history详细信息
kubectl rollout history statefulset web --revision=1

# 执行回滚操作
kubectl rollout undo statefulset web --to-revision=1

1.3.6 暂停与恢复

# 暂停部署
kubectl rollout pause statefulset web

# 恢复部署
kubectl rollout resume statefulset web

1.3.7 重新部署应用

# 重新部署
kubectl rollout restart statefulset web

1.4 DaemonSet

1.4.1 创建DaemonSet

# 创建Yaml文件
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: nginx
imagePullPolicy: IfNotPresent

1.4.2 查看DaemonSet

kubectl get daemonsets.apps
DESIRED: 请求的副本数
CURRENT:实际运行的副本数
READY:副本数为READY的数量
UP-TO-DATE: 升级最新的Pod数量
AVAILABLE:可用的Pod数量
NODE SELECTOR: 节点选择器
AGE:生命周期

1.4.3 升级image

# 方法一
更改本地yaml,并使用apply升级

# 方法二
使用edit更改运行的daemonsets,修改container的image

# 方法三
通过命令行升级并记录升级信息:kubectl set image daemonsets fluentd-elasticsearch fluentd-elasticsearch=nginx:latest --record

# 查看deployment升级的状态
kubectl rollout status daemonsets fluentd-elasticsearch

1.4.4 回滚

# 查看历史记录
kubectl rollout history daemonsets fluentd-elasticsearch

# 查看某一个记录的详细信息
kubectl rollout history daemonsets fluentd-elasticsearch --revision=1

# 执行回滚操作
kubectl rollout undo daemonsets fluentd-elasticsearch --to-revision=1

1.4.5 暂停与恢复

# 暂停部署
kubectl rollout pause daemonsets fluentd-elasticsearch

# 恢复部署
kubectl rollout resume daemonsets fluentd-elasticsearch

1.4.6 重新部署应用

# 重新部署
kubectl rollout restart daemonsets fluentd-elasticsearch

1.5 Jobs and CronJob

1.5.1 创建Job

# 编写Yaml文件
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
imagePullPolicy: IfNotPresent
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
completions: 6
parallelism: 2

1.5.2 查看Jobs

kubectl get job
NAME: Job的名字
COMPLETIONS:完成的数量/总数量
DURATION:持续时间
AGE:生命周期

1.5.3 创建CronJob

# 编写Yaml文件
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

1.5.4 查看CronJob

kubectl get cronjob
SCHEDULE:时间表
SUSPEND:暂停
ACTIVE:激活的任务
LAST SCHEDULE:最后执行的时间

2. Services 与 Load Balancing

· 阅读需 3 分钟

2.1 Services

2.1.1 Services常用命令

# 查看Services
kubectl get services

# 创建ClusterIP
kubectl expose deployment `<NAME>` --type=ClusterIP --target-port=`<PORT>` --port=`<PORT>`

# 创建NodePort
kubectl expose deployment `<NAME>` --type=NodePort --target-port=`<PORT>` --port=`<PORT>`

# 创建ExternalName
kubectl create service externalname `<NAME>` --external-name=www.baidu.com

# 创建Headless Service
kubectl expose deployment `<NAME>` --type=ClusterIP --cluster-ip=None

# 创建ExternalIP
kubectl expose deployment `<NAME>` --type=ClusterIP --external-ip=`<IP_ADDRESS>`

# 删除Service
kubectl delete services `<NAME>`

2.1.2 ClusterIP类型

ClusterIP用户实现Kubernetes集群中内部服务的访问

# 编写Yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service
spec:
type: ClusterIP
selector:
app: pod-nginx
ports:
- port: 80
targetPort: 80

2.1.3 NodePort类型

NodePort用户实现Kubernetes集群内部服务的对外暴露

# 编写Yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service
spec:
type: NodePort
selector:
app: pod-nginx
ports:
- port: 80
targetPort: 80
# nodePort: 30696

2.1.4 ExternalName类型

ExternalName用户实现Kubernetes集群中的应用可以通过Service访问集群外地的域名服务

# 编写yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: www.baidu.com

2.1.5 ExternalIP方式

ExternalIP用户于实现Kubernetes集群内部服务的对外暴露

# 编写Yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: pod-nginx
ports:
- name: http
protocol: TCP
port: 18080
targetPort: 80
externalIPs:
- 172.17.210.201
- 172.17.210.202

2.1.6 Headless Services

Headless Service用于满足不需要负载均衡或者Service IP的服务

# 编写yaml
apiVersion: v1
kind: Service
metadata:
name: headless-service
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: statefulset-nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: statefulset-nginx
serviceName: "headless-service"
replicas: 3
template:
metadata:
labels:
app: statefulset-nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent

2.1.7 External_IP_Port方式

External_IP_Port用于实现Kubernetes集群中的应用可以通过Service访问集群外部的IP:Port服务

# 编写Service Yaml文件
apiVersion: v1
kind: Service
metadata:
name: external-ip-port
spec:
clusterIP: None
type: ClusterIP
ports:
- port: 3306
targetPort: 3306

# 编写Endpoints Yaml文件
apiVersion: v1
kind: Endpoints
metadata:
name: external-ip-port
subsets:
- addresses:
- ip: 192.168.1.1
ports:
- port: 3306
protocol: TCP

2.1.8 会话保持

# 编写Yaml文件
apiVersion: v1
kind: Service
metadata:
name: clusterip-service
spec:
sessionAffinity: ClientIP
clientIP:
timeoutSeconds: 10800
type: ClusterIP
selector:
app: pod-nginx
ports:
- port: 80
targetPort: 80

2.2 Ingress

2.2.1 部署Ingress Nginx Controllers

访问https://github.com/kubernetes/ingress-nginx/tree/master/deploy/static/provider/baremetal

# 下载deploy.yaml,并做如下修改:
注释创建services(273 - 300行)
在Deployment中添加hostNetwork: true(在329行下面添加)

2.2.2 创建Ingress

# 练习一
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
backend:
serviceName: test01
servicePort: 80

# 练习二
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: test01
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: test02
servicePort: 80

# 练习三
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
backend:
serviceName: test01
servicePort: 80
- path: /bar
backend:
serviceName: test02
servicePort: 80