yaml文件及语法基础:
需要提前创建好ymal文件,并创建好好pod运行所需要的namespace、yaml文件等资源
# pwd
/opt/k8s-data/yaml/
# mkdir namespaces linux37
# cd namespaces
# cat linux37.yaml
apiVersion: v1 #API版本
kind: Namespace #类型为namespac
metadata: #定义元数据
name: linux37 #namespace名称
查看当前版本
root@master:~# kubectl explain namespace.apiVersion
KIND: Namespace
VERSION: v1
查看kind类型
root@master:/opt/k8s-data/yaml/namespaces# kubectl explain namespaces.kind
KIND: Namespace
VERSION: v1
FIELD: kind <string>
添加一个yaml文件
root@master:/opt/k8s-data/yaml/namespaces# cat wyh.yaml
apiVersion: v1
kind: Namespace
metadata:
name: wyh
创建namespace
namespace命名空间是在大型项目开发中,为了避免命名冲突而引入的一种机制。
root@master:/opt/k8s-data/yaml/namespaces# kubectl apply -f wyh.yaml
namespace/wyh created
查看namespace
root@master:/opt/k8s-data/yaml/namespaces# kubectl get namespaces | grep wyh
wyh Active 42s
3.1.2.2:yaml与json:
yaml和json对比,在线yaml与json编辑器:http://www.bejson.com/validators/yaml_editor/
json格式
{ '人员名单':
{ '张三': { '年龄': 18, '职业': 'Linux运维工程师', '爱好': [ '看书', '学习', '加班' ] },
'李四': { '年龄': 20, '职业': 'Java开发工程师', '爱好': [ '开源技术', '微服务', '分布式
存储' ] } } }
#json特点:
json 不能注释
json 可读性较差
json 语法很严格
比较适用于API 返回值,也可用于配置文件
json格式
人员名单:
张三:
年龄: 18
职业: Linux运维工程师
爱好:
- 看书
- 学习
- 加班
李四:
年龄: 20
职业: Java开发工程师 #
爱好:
- 开源技术
- 微服务
- 分布式存储
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tal键,只允许使用空格
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
使用”#” 表示注释,从这个字符一直到行尾,都会被解析器忽略
比json更适用于配置文件
yaml文件主要特性:
k8s中的yaml文件以及其他场景的yaml文件,大部分都是以下类型
上下级关系
列表
键值对(也称为maps,即key:value 格式的键值对数据)
Nginx 业务yaml文件详解
# pwd
/opt/k8s-data/yaml/linux36
# mkdir nginx tomcat-app1 tomcat-app2
# cd nginx/
# pwd
/opt/k8s-data/yaml/linux36/nginx
# cat nginx.yaml
kind: Deployment #类型,是deployment控制器,kubectl explain Deployment
apiVersion: extensions/v1beta1 #API版本,# kubectl explain Deployment.apiVersion
metadata: #pod的元数据信息,kubectl explain Deployment.metadata
labels: #自定义pod的标签,# kubectl explain Deployment.metadata.labels
app: linux36-nginx-deployment-label #标签名称为app值为linux36-nginx-deploymentlabel,后面会用到此标签
name: linux36-nginx-deployment #pod的名称
namespace: linux36 #pod的namespace,默认是defaule
spec: #定义deployment中容器的详细信息,kubectl explain Deployment.spec
replicas: 1 #创建出的pod的副本数,即多少个pod,默认值为1
selector: #定义标签选择器
matchLabels: #定义匹配的标签,必须要设置
app: linux36-nginx-selector #匹配的目标标签,
template: #定义模板,必须定义,模板是起到描述要创建的pod的作用
metadata: #定义模板元数据
labels: #定义模板label,Deployment.spec.template.metadata.labels
app: linux36-nginx-selector #定义标签,等于
Deployment.spec.selector.matchLabels
spec: #定义pod信息
containers:#定义pod中容器列表,可以多个至少一个,pod不能动态增减容器
- name: linux36-nginx-container #容器名称
image: harbor.magedu.net/linux36/nginx-web1:v1 #镜像地址
#command: ["/apps/tomcat/bin/run_tomcat.sh"] #容器启动执行的命令或脚本
#imagePullPolicy: IfNotPresent
imagePullPolicy: Always #拉取镜像策略
ports: #定义容器端口列表
- containerPort: 80 #定义一个端口
protocol: TCP #端口协议
name: http #端口名称
- containerPort: 443 #定义一个端口
protocol: TCP #端口协议
name: https #端口名称
env: #配置环境变量
- name: "password" #变量名称。必须要用引号引起来
value: "123456" #当前变量的值
- name: "age" #另一个变量名称
value: "18" #另一个变量的值
resources: #对资源的请求设置和限制设置
limits: #资源限制设置,上限
cpu: 2 #cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: 2Gi #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: 1 #cpu请求数,容器启动的初始可用数量,可以写0.5或者500m等CPU压缩值
memory: 512Mi #内存请求大小,容器启动的初始可用数量,用于调度pod时候使用
---
kind: Service #类型为service
apiVersion: v1 #service API版本, service.apiVersion
metadata: #定义service元数据,service.metadata
labels: #自定义标签,service.metadata.labels
app: linux36-nginx #定义service标签的内容
name: linux36-nginx-spec #定义service的名称,此名称会被DNS解析
namespace: linux36 #该service隶属于的namespaces名称,即把service创建到哪个namespace里面
spec: #定义service的详细信息,service.spec
type: NodePort #service的类型,定义服务的访问方式,默认为ClusterIP, service.spec.type
ports: #定义访问端口, service.spec.ports
- name: http #定义一个端口名称
port: 80 #service 80端口
protocol: TCP #协议类型
targetPort: 80 #目标pod的端口
673.1.3:k8s中创建Nginx pod:
创建Nginx pod 并测试通过node port访问
3.1.3.1:Nginx yaml文件:
nodePort: 30001 #node节点暴露的端口
- name: https #SSL 端口
port: 443 #service 443端口
protocol: TCP #端口协议
targetPort: 443 #目标pod端口
nodePort: 30043 #node节点暴露的SSL端口
selector: #service的标签选择器,定义要访问的目标pod
app: linux36-nginx #将流量路到选择的pod上,须等于
Deployment.spec.selector.matchLabels
HPA自动伸缩pod数量:
kubectl autoscale 自动控制在k8s集群中运行的pod数量(水平自动伸缩),需要提前设置pod范围及触发条件。
k8s从1.1版本开始增加了名称为HPA(Horizontal Pod Autoscaler)的控制器,用于实现基于pod中资源
(CPU/Memory)利用率进行对pod的自动扩缩容功能的实现,早期的版本只能基于Heapster组件实现对CPU利用率
做为触发条件,但是在k8s 1.11版本开始使用Metrices Server完成数据采集,然后将采集到的数据通过
API(Aggregated API,汇总API),例如metrics.k8s.io、custom.metrics.k8s.io、external.metrics.k8s.io,然后
再把数据提供给HPA控制器进行查询,以实现基于某个资源利用率对pod进行扩缩容的目的
控制管理器默认每隔15s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源
使用情况
支持以下三种metrics指标类型:
->预定义metrics(比如Pod的CPU)以利用率的方式计算
->自定义的Pod metrics,以原始值(raw value)的方式计算
->自定义的object metrics
支持两种metrics查询方式:
->Heapster
->自定义的REST API
支持多metrics

准备metrics-server:
使用metrics-server作为HPA数据源。
https://github.com/kubernetes-incubator/metrics-server
clone代码:
# git clone https://github.com/kubernetes-incubator/metrics-server.git
# cd metrics-server/
准备image:
root@master:~/metrics-server# docker pull mirrorgooglecontainers/metrics-server-amd64:v0.3.5
# docker pull k8s.gcr.io/metrics-server-amd64:v0.3.5
# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-serveramd64:v0.3.5
打标签
root@master:~/metrics-server# docker tag mirrorgooglecontainers/metrics-server-amd64:v0.3.5 harbor.wyh.net/baseimages/mirrorgooglecontainers/metrics-server-amd64:v0.3.5
上传镜像
root@master:~/metrics-server# docker push harbor.wyh.net/baseimages/mirrorgooglecontainers/metrics-server-amd64:v0.3.5
修改yaml文件:
root@master:~/metrics-server/deploy/1.8+# vim metrics-server-deployment.yaml
32 image: harbor.wyh.net/baseimages/mirrorgooglecontainers/metrics-server-amd64:v0.3.5
修改为本地的镜像地址
创建metrics-server服务
root@master:~/metrics-server/deploy/1.8+# kubectl apply -f .
验证metrics-server pod:
root@master:~/metrics-server/deploy/1.8+# kubectl get pods -n kube-system | grep me
metrics-server-7cc666b7c6-d9k64 1/1 Running 0 2m6s
修改controller-manager启动参数:
root@master:~/metrics-server/deploy/1.8+# kube-controller-manager --help | grep horizontal-pod-autoscaler-sync-period
--horizontal-pod-autoscaler-sync-period duration The period for syncing the number of pods in horizontal pod autoscaler. (default 15s)
定义pod数量水平伸缩的间隔周期,默认15秒
root@master:~/metrics-server/deploy/1.8+# vim /etc/systemd/system/kube-controller-manager.service
18 --horizontal-pod-autoscaler-sync-period=10s \
#数据采集周期间隔时间
重启controller-manager:
验证以上参数是否生效
root@master:~# systemctl daemon-reload
root@master:~# systemctl restart kube-controller-manager.service
root@master:~# ps -ef | grep controller
root 84476 1 0 09:08 ? 00:00:01 /usr/bin/kube-controller-manager --address=127.0.0.1 --master=http://127.0.0.1:8080 --allocate-node-cidrs=true --service-cluster-ip-range=10.20.0.0/16 --cluster-cidr=172.31.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem --cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem --service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem --root-ca-file=/etc/kubernetes/ssl/ca.pem --horizontal-pod-autoscaler-use-rest-clients=true --horizontal-pod-autoscaler-sync-period=10s --leader-elect=true --v=2
root 86492 85195 0 09:13 pts/4 00:00:00 grep --color=auto controller
通过命令配置扩缩容:
root@master:~# kubectl autoscale deployment/linux37-tomcat-app1-deployment --min=2 --max=10 --cpu-percent=80 -n linux37
horizontalpodautoscaler.autoscaling/linux37-tomcat-app1-deployment autoscaled
DESIRED 最终期望处于READY状态的副本数
CURRENT 当前的副本总数
UP-TO-DATE 当前完成更新的副本数
AVAILABLE 当前可用的副本数
查看pod的cpu利用率
root@master:~# kubectl get hpa -n linux37
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
linux37-nginx-deployment Deployment/linux37-nginx-deployment <unknown>/80% 2 10 2 7m5s
linux37-tomcat-app1-deployment Deployment/linux37-tomcat-app1-deployment 0%/80% 2 10 2 4m34s
linux37-tomcat-app1-podautoscaler Deployment/linux37-tomcat-app1-deployment 138309632/1Gi, 0%/1% 1 5 2 2d4h
yaml文件中定义扩缩容配置:
定义在tomcat服务中的yaml中
root@master:/opt/k8s-data/yaml/web/linux37/tomcat-app2# vim tomcat-app2.yaml
57 app: linux37-tomcat-app2-selector
58 ---
59 apiVersion: autoscaling/v2beta1
60 kind: HorizontalPodAutoscaler
61 metadata:
62 namespace: linux37
63 name: linux37-tomcat-app2-podautoscaler
64 labels:
65 app: linux37-tomcat-app2
66 version: v2beta1
67 spec:
68 scaleTargetRef:
69 apiVersion: apps/v1
70 kind: Deployment
71 name: linux37-tomcat-app2-deployment
72 minReplicas: 2
73 maxReplicas: 5
74 metrics:
75 - type: Resource
76 resource:
77 name: cpu
78 targetAverageUtilization: 80
79 - type: Resource
80 resource:
81 name: memory
82 targetAverageValue: 1024Mi
执行
root@master:/opt/k8s-data/yaml/web/linux37/tomcat-app2# kubectl apply -f tomcat-app2.yaml
deployment.extensions/linux37-tomcat-app2-deployment configured
service/linux37-tomcat-app2-service unchanged
horizontalpodautoscaler.autoscaling/linux37-tomcat-app2-podautoscaler created
修改文件
root@master:~/metrics-server/deploy/1.8+# vim metrics-server-deployment.yaml
31 - name: metrics-server
32 image: harbor.wyh.net/baseimages/mirrorgooglecontainers/metrics-server-amd64:v0.3.5
33 # args:
34 # - --cert-dir=/tmp
35 # - --secure-port=4443
36 # ports:
37 # - name: main-port
38 # containerPort: 4443
39 # protocol: TCP
40 # securityContext:
41 # readOnlyRootFilesystem: true
42 # runAsNonRoot: true
43 # runAsUser: 1000
44 imagePullPolicy: Always
45 args:
46 - --kubelet-insecure-tls
47 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
重新执行
root@master:~/metrics-server/deploy/1.8+# kubectl apply -f .
查看确认都起来了
root@master:~/metrics-server/deploy/1.8+# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-74877c8576-d7mp6 1/1 Running 0 9h
calico-node-52kx7 1/1 Running 2 7d5h
calico-node-5zp8x 1/1 Running 5 7d7h
calico-node-pb8wr 1/1 Running 5 8d
calico-node-tgpx5 1/1 Running 2 7d5h
heapster-84b5498c45-4zffp 1/1 Running 0 28h
kube-dns-7f4c7bf568-b69zd 3/3 Running 0 9h
kubernetes-dashboard-7b6bfb77c5-hdw4l 1/1 Running 0 28h
metrics-server-cf97d97b-4n5sw 1/1 Running 0 16s
monitoring-grafana-6c64fbbbb8-chz4h 1/1 Running 0 9h
monitoring-influxdb-74bb4ffb55-9fzbs 1/1 Running 0 28h
查看deployment没有问题
root@master:~/metrics-server/deploy/1.8+# kubectl get deployment -n linux37
NAME READY UP-TO-DATE AVAILABLE AGE
linux37-nginx-deployment 2/2 2 2 3d5h
linux37-tomcat-app1-deployment 2/2 2 2 2d6h
linux37-tomcat-app2-deployment 2/2 2 2 2d6h
网友评论