Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。 Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互 。 Helm 部署越来越多的公司和团队开始使用 Helm 这个 Kubernetes 的包管理器,我们也将使用 Helm 安装 Kubernetes 的常用组件。
Helm 由helm客户端命令行工具和服务端 tiller 组成,Helm 的安装十分简单。
下载 helm 命令行工具到master 节点 node1 的 /usr/local/bin 下,这里下载的 2.13. 1版本:
ntpdate ntp1.aliyun.com 官网下载地址:https://github.com/kubernetes/helm/releases wget https://get.helm.sh/helm-v2.13.1-linux-amd64.tar.gz tar -zxvf helm-v2.13.1-linux-amd64.tar.gz cd linux-amd64/ cp helm /usr/local/bin/ helm命令行工具完成 为了安装服务端 tiller,还需要在这台机器上配置好 kubectl 工具和 kubeconfig 文件,确保 kubectl 工具可以
在这台机器上访问 apiserver 且正常使用。 这里的 node1 节点已经配置好了 kubectl
因为 Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的 service account: tiller 并分
配合适的角色给它。 详细内容可以查看helm文档中的 Role-based Access Control。 这里简单起见直接分配
cluster- admin 这个集群内置的 ClusterRole 给它。创建 rbac-config.yaml 文件:
$ vim rbac-config.yaml kubectl create -f rbac-config.yaml
tiller服务端安装(指定上面创建的service account初始化) helm init --service-account=tiller --skip-refresh 注:如果镜像下载失败,可以换成阿里云的镜像 进入查看安装结果 kubectl edit pod tiller-deployment-xxx -n kube-system tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下kubectl get pod -n kube-system -l app=helm 开始使用Helm 自定义模板# 创建文件夹 $ mkdir ./test $ cd ./test # 创建自描述文件 Chart.yaml , 这个文件必须由 name 和 version 定义 $ cat <<'EOF' > ./Chart.yaml name: hello-world version: 1.0.0 EOF # 创建模板文件, 用于生成 Kubernetes 资源清单(manifests) $ mkdir ./templates #必须是这个目录名,不能改 $ cat <<'EOF' > ./templates/deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: wangyanglinux/myapp:v1 ports: - containerPort: 80 protocol: TCP EOF $ cat <<'EOF' > ./templates/service.yaml apiVersion: v1 kind: Service metadata: name: hello-world spec: type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP selector: app: hello-world EOF # 使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release 查看当前helm运行列表信息
如果修改了yaml文件需要更新时: 查看更新历史: 回滚 helm rollback nobby-eel 1
查看当前pod信息: 查看当前helm运行状态:
访问测试: 就可以把下面的目录打包发给别人,用于部署应用程序(当然以上实验比较简单,只包含了一个应用程序,可以部署多个或者集群) 简单总结下关系概念: 在docker里,它会把我们的应用程序封装成一个镜像,在部署应用程序时,只需要运行镜像即可。 在k8s里,helm是把我们集群的部署方案写入到Chart中,然后通过Chart去部署出来一个集群, 也就是生成对应的release,然后在docker里面就会生成对应的容器。 常用其他命令: # 列出已经部署的 Release 更新操作 # 新建配置文件 values.yaml $ cat <<'EOF' > ./values.yaml image: repository: wangyanglinux/myapp tag: 'v2' EOF # 这个文件中定义的值,在模板文件中可以通过 .Values对象访问到 $ cat <<'EOF' > ./templates/deployment.yaml #(直接修改上面的文件) apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 8080 protocol: TCP EOF 查看更新结果: 或者使用更简单的方式更新: helm upgrade nobby-eel --set image.tag='v3' . 由此可知道:如果我们把当前公司的集群项目改成Chart方案,后续我们更新资料的时候,只需要指定values更改即可。 Debug方式创建 使用模板动态生成K8s资源清单时,非常需要能提前预览生成的结果 # 使用--dry-run --debug 选项来打印出生成的清单文件内容,尝试而不执行部署 使用Helm部署 dashboard (K8S官方管理工具)更换helm仓库源的方式部署dashboard 使用helm fetch stable/kubernetes-dashboard 把Chart的压缩包下载到本地使用。 (可能会提示更新repo,使用helm repo update)--类似于Linux中yum仓库更新 或者直接下载再上传 http://mirror./kubernetes/charts/kubernetes-dashboard-1.8.0.tgz
下载后得到下载的压缩包 解压并进入目录 会发现和上面自己创建的目录结构一样。 创建kubernetes-dashboard.yaml: (和上面实验创建的value.yaml含义一样) image: repository: k8s.gcr.io/kubernetes-dashboard-amd64 tag: v1.10.1 ingress: enabled: true hosts: - k8s.frognew.com annotations: nginx.ingress.kubernetes.io/ssl-redirect: 'true' nginx.ingress.kubernetes.io/backend-protocol: 'HTTPS' tls: - secretName: frognew-com-tls-secret hosts: - k8s.frognew.com rbac: clusterAdminRole: true 提前下载导入dashboard.tar包,免得下面部署的时候下载慢或者下载失败问题 docker load -i dashboard.tar
使用helm创建release helm install . \ -n kubernetes-dashboard \ #指定名称 --namespace kube-system \ #指定名称空间 -f kubernetes-dashboard.yaml #指定创建的yaml文件 查看Pod创建情况,查看svc创建情况
现在是ClusterIP方式,修改为NodePort方式(或者Ingress),暴露服务给外界访问。 kubectl edit svc kubernetes-dashboard -n kube-system 再查看svc信息(注意:这是https协议访问的) 访问测试:
可以通过指定kubeconfig文件访问,也可以通过令牌token的方式访问。 查看token $ kubectl -n kube-system get secret | grep kubernetes-dashboard-token kubernetes.io/service-account-token 3 3m7s 然后通过输入token登录
进入管理页面 然后就可以在管理页面创建应用了 使用Helm部署metrics-server(监控项目)从 Heapster 的 github <https://github.com/kubernetes/heapster >中可以看到已经,heapster 已经DEPRECATED。
这里是 heapster的deprecation timeline。 可以看出 heapster 从 Kubernetes 1.12 开始将从 Kubernetes 各种安装脚
本中移除。Kubernetes 推荐使用 metrics-server。我们这里也使用helm来部署metrics-server。
metrics-server.yaml:
args: - --logtostderr - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP helm install stable/metrics-server \ -n metrics-server \ --namespace kube-system \ -f metrics-server.yaml 使用下面的命令可以获取到关于集群节点基本的指标信息:
部署Prometheus(监控项目)注意:部署Prometheus和metrics-server时选其一,前者集成了后者,且功能更多。 相关地址信息Prometheus github 地址:https://github.com/coreos/kube-prometheus
组件说明1.MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如
kubectl,hpa,scheduler等。
2.PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。
3.NodeExporter:用于各node的关键度量指标状态数据。
4.KubeStateMetrics:收集kubernetes集群内资源对象数据,制定告警规则。
5.Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通过http协议传输。
6.Grafana:是可视化数据统计和监控平台。
构建记录mkdir prometheus && cd prometheus 修改 grafana-service.yaml 文件,使用 NodePort 方式访问 grafana:
vim grafana-service.yaml apiVersion: v1 kind: Service metadata: name: grafana namespace: monitoring spec: type: NodePort #添加内容 ports: - name: http port: 3000 targetPort: http nodePort: 30100 #添加内容 selector: app: grafana 修改 prometheus-service.yaml,改为 NodePort
vim prometheus-service.yaml apiVersion: v1 kind: Service metadata: labels: prometheus: k8s name: prometheus-k8s namespace: monitoring spec: type: NodePort #添加内容 ports: - name: web port: 9090 targetPort: web nodePort: 30200 #添加内容 selector: app: prometheus prometheus: k8s 修改 alertmanager-service.yaml,改为 NodePort
vim alertmanager-service.yaml apiVersion: v1 kind: Service metadata: labels: alertmanager: main name: alertmanager-main namespace: monitoring spec: type: NodePort ports: - name: web port: 9093 targetPort: web nodePort: 30300 selector: alertmanager: main app: alertmanager 下载并上传加载 PrometheusOperator的镜像文件(更快,否则会在部署的时候自动下载,速度很慢) 解压并执行load-images.sh加载脚本 将上面使用文件拷贝到node节点服务器(node01、node02) 然后在node节点服务器同样执行导入镜像操作 通过yaml文件创建 进入解压缩后的kube-prometheus\manifests目录下,可看到全是yaml文件 kubectl apply -f ../manifests/ 查看pod创建状态 然后就可以查看监控信息了 kubectl top node 访问 prometheusprometheus 对应的 nodeport 端口为 30200,访问 http://MasterIP:30200
通过访问 http://MasterIP:30200/target 可以看到 prometheus 已经成功连接上了 k8s 的 apiserver
查看 service-discovery
Prometheus 自己的指标
prometheus 的 WEB 界面上提供了基本的查询 K8S 集群中每个 POD 的 CPU 使用情况,查询条件如下:
sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!='', pod_name!=''}[1m] ) ) 上述的查询有出现数据,说明 node-exporter 往 prometheus 中写入数据正常,接下来我们就可以部署
grafana 组件,实现更友好的 webui 展示数据了
访问 grafana查看 grafana 服务暴露的端口号:
如上可以看到 grafana 的端口号是 30100,浏览器访问 http://MasterIP:30100 用户名密码默认 admin/admin
修改密码并登陆
添加数据源 grafana 默认已经添加了 Prometheus 数据源,grafana 支持多种时序数据源,每种数据源都有各自的查询编辑器 Prometheus 数据源的相关参数: 目前官方支持了如下几种数据源:
就可以实现资源的监控了,例如node节点监控信息 监控部分就完成了! Horizontal Pod Autoscaling没外网可先下载上传压缩包然后加载镜像(node节点服务器执行相同操作导入镜像) 先下载示例镜像 docker load -i hpa-example.tar
Horizontal Pod Autoscaling 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量 。 kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose --port=80
--requests=cpu=200m:就是一个资源限制,初始分配值 查看pod的监控信息(是否能正常获取)
创建 HPA 控制器(CPU负载超过50%就扩容,最大扩容数为10,负载小了之后会减小节点数,最少保持1个) kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 查看hpa信息(现在的负载为0%) 已经获取到资源了 增加负载,查看负载节点数目 (压测) $ kubectl run -i --tty load-generator --image=busybox /bin/sh $ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done 可以看到CPU利用率上去了,然后就会自动扩容增加Pod数量减压,最大增加到上面设置的10个上限 查看此时Pod的创建状态 稍等会儿就可以看到创建了10个pod,第10个正在被创建
资源限制 - Pod
Kubernetes 对资源的限制实际上是通过 cgroup 来控制的,cgroup 是容器的一组用来控制内核如何运行进程的相关属性集合。
针对内存、CPU 和各种设备都有对应的 cgroup。
默认情况下,Pod 运行没有 CPU 和内存的限额。 这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样,
消耗足够多的 CPU 和内存 。一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过resources 的 requests 和 limits 来实现。
spec: containers: - image: xxxx imagePullPolicy: Always name: auth ports: - containerPort: 8080 protocol: TCP resources: limits: #最大分配资源 cpu: '4' memory: 2Gi requests: #初始分配资源 cpu: 250m memory: 250Mi requests 要分配的资源,limits 为最高请求的资源值。可以简单理解为初始值和最大值
资源限制 - 名称空间Ⅰ、计算资源配额
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources namespace: spark-cluster spec: hard: pods: '20' requests.cpu: '20' requests.memory: 100Gi limits.cpu: '40' limits.memory: 200Gi Ⅱ、配置对象数量配额限制 apiVersion: v1 kind: ResourceQuota metadata: name: object-counts namespace: spark-cluster spec: hard: configmaps: '10' persistentvolumeclaims: '4' #PV限制 replicationcontrollers: '20' #RC限制 secrets: '10' services: '10' services.loadbalancers: '2' Ⅲ、配置 CPU 和 内存 LimitRange (如果上面两种都没设置,如下这样限制pod使用的最大资源) apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: #最大值 memory: 50Gi cpu: 5 defaultRequest: #初始值 memory: 1Gi cpu: 1 type: Container ·default 即 limit 的值
·defaultRequest 即 request 的值
部署 EFK日志平台(部署很简单,但是对系统要求很高,默认配置内存至少需要20G以上) 添加 Google incubator 仓库helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator 部署 Elasticsearchkubectl create namespace efk #创建名称空间 helm fetch incubator/elasticsearch #提前下载好镜像 部署 Fluentd部署 kibana注意:部署EFK时,E和K的版本必须一致,否则会报错 helm fetch stable/kibana --version 0.14.8 查看Pod创建情况 修改svc访问方式(默认不允许外部访问) $ kubectl edit svc kib1-kibana -n efk
type: NodePort
修改后: 访问测试: |
|