美文网首页
1.yaml基础及hpa基础

1.yaml基础及hpa基础

作者: 哆啦A梦_ca52 | 来源:发表于2019-12-04 22:56 被阅读0次

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
image.png
准备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


相关文章

网友评论

      本文标题:1.yaml基础及hpa基础

      本文链接:https://www.haomeiwen.com/subject/pmyxgctx.html