k8s部署dns组件和heapster监控
dns组件是为整个k8s提供dns服务的,有dns,在连接其他资源时就可以用资源名来连接即可
1.安装dns组件
1.1.获取dns组件所需的镜像
[root@k8s-master dns]# docker pull docker.io/gysan/kube-dnsmasq-amd64
[root@k8s-master dns]# docker pull docker.io/ist0ne/kubedns-amd64
[root@k8s-master dns]# docker pull docker.io/ist0ne/dnsmasq-metrics-amd64
[root@k8s-master dns]# docker pull docker.io/huangyj/exechealthz-amd64
将镜像导出方便下次使用
[root@k8s-master docker]# for i in `docker images | egrep 'dns|exec' | grep '^d' | awk '{print $1}'`
> do
> image=`echo $i | awk -F "/" '{print $3}'`
> docker save $i > ${image}.tar.gz
> done
1.2.将镜像打标签推送至镜像仓库
由于镜像较多,因此我们对镜像批量打标签
[root@k8s-master dns]# for i in `docker images | egrep 'dns|exec' |awk '{print $1}'`
> do
> Image=`echo $i | awk -F '/' '{print $3}'`
> docker tag $i 192.168.81.240/k8s/${Image}:latest;
> done
[root@k8s-master dns]# docker images | egrep 'dns|exec' | awk '/^1/{print $1}'
192.168.81.240/k8s/kube-dnsmasq-amd64
192.168.81.240/k8s/kubedns-amd64
192.168.81.240/k8s/dnsmasq-metrics-amd64
192.168.81.240/k8s/exechealthz-amd64
批量推送至harbor
[root@k8s-master dns]# docker images | egrep 'dns|exec' | awk '/^1/{print $1}' | xargs -I {} docker push {}
1.3.编辑deployment资源文件
[root@k8s
-master dns
]
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube
-dns
namespace: kube
-system
labels:
k8s-app: kube
-dns
kubernetes.io/cluster-service: "true"
spec:
replicas: 1
strategy:
rollingUpdate:
maxSurge: 10%
maxUnavailable: 0
selector:
matchLabels:
k8s-app: kube
-dns
template:
metadata:
labels:
k8s-app: kube
-dns
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
spec:
containers:
- name: kubedns
image: 192.168.81.240/k8s/kubedns
-amd64
:latest
resources:
limits:
memory: 170Mi
requests:
cpu: 100m
memory: 70Mi
livenessProbe:
httpGet:
path: /healthz
-kubedns
port: 8080
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /readiness
port: 8081
scheme: HTTP
initialDelaySeconds: 3
timeoutSeconds: 5
args:
- --domain=cluster.local.
- --dns
-port=10053
- --config
-map=kube
-dns
- --kube
-master
-url=http
://192.168.81.210
:8080
- --v=0
env:
- name: PROMETHEUS_PORT
value: "10055"
ports:
- containerPort: 10053
name: dns
-local
protocol: UDP
- containerPort: 10053
name: dns
-tcp
-local
protocol: TCP
- containerPort: 10055
name: metrics
protocol: TCP
- name: dnsmasq
image: 192.168.81.240/k8s/kube
-dnsmasq
-amd64
:latest
livenessProbe:
httpGet:
path: /healthz
-dnsmasq
port: 8080
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
args:
- --cache
-size=1000
- --no
-resolv
- --server=127.0.0.1
ports:
- containerPort: 53
name: dns
protocol: UDP
- containerPort: 53
name: dns
-tcp
protocol: TCP
resources:
requests:
cpu: 150m
memory: 10Mi
- name: dnsmasq
-metrics
image: 192.168.81.240/k8s/dnsmasq
-metrics
-amd64
:latest
livenessProbe:
httpGet:
path: /metrics
port: 10054
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
args:
- --v=2
- --logtostderr
ports:
- containerPort: 10054
name: metrics
protocol: TCP
resources:
requests:
memory: 10Mi
- name: healthz
image: 192.168.81.240/k8s/exechealthz
-amd64
:latest
resources:
limits:
memory: 50Mi
requests:
cpu: 10m
memory: 50Mi
args:
- --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1
>/dev/null
- --url=/healthz
-dnsmasq
- --cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1
:10053
>/dev/null
- --url=/healthz
-kubedns
- --port=8080
- --quiet
ports:
- containerPort: 8080
protocol: TCP
dnsPolicy: Default
一共有5处修改
52行,修改kubedns
-amd64镜像地址
85行,修改api
-server镜像地址
104行,修改kube
-dnsmasq
-amd64镜像地址
132行,修改dnsmasq
-metrics
-amd64镜像地址
153行,修改healthz镜像地址
1.4.编辑svc资源文件
[root@k8s
-master dns
]
apiVersion: v1
kind: Service
metadata:
name: kube
-dns
namespace: kube
-system
labels:
k8s-app: kube
-dns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: "KubeDNS"
spec:
selector:
k8s-app: kube
-dns
clusterIP: 10.254.230.254
ports:
- name: dns
port: 53
protocol: UDP
- name: dns
-tcp
port: 53
protocol: TCP
基本不需要改动
1.4.创建资源
[root@k8s-master dns]# kubectl create -f skydns-deploy.yaml
[root@k8s-master dns]# kubectl create -f skydns-svc.yaml
或者
[root@k8s-master dns]# kubectl create -f /k8s/dns/
deployment "kube-dns" created
service "kube-dns" created
1.5.查看资源
[root@k8s-master dns]# kubectl get all -o wide --namespace=kube-system
1.6.在各节点增加dns配置
[root@k8s-node1 ~]# vim /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"
[root@k8s-node1 ~]# systemctl restart kubelet
1.7.验证dns
[root@k8s
-master dns
]
apiVersion: v1
kind: Pod
metadata:
labels:
name: busybox_dns
role: master
name: busybox
spec:
containers:
- name: busybox
image: 192.168.81.240/k8s/busybox
:latest
command:
- sleep
- "36000"
[root@k8s
-master dns
]
[root@k8s
-master dns
]
/
Server: 10.254.230.254
Address: 10.254.230.254
:53
Non
-authoritative answer
:
Name: kubernetes.default.svc.cluster.local
Address: 10.254.0.1
1.8.将tomcat项目中的ip地址换成域名并测试应用
1)修改tomcatrc资源,连接mysql时使用域名
[root@k8s-master tomcat]# vim tomcat-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: mytomcat
spec:
replicas: 1
selector:
app: mytomcat
template:
metadata:
labels:
app: mytomcat
spec:
containers:
- name: mytomcat
image: 192.168.81.240/k8s/tomcat-app:v2
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql' #这里从ip修改为域名
- name: MYSQL_SERVICE_PORT
value: '3306'
2)更新配置
[root@k8s-master tomcat]# kubectl apply -f tomcat-rc.yml
replicationcontroller "mytomcat" configured
3)访问页面
http://192.168.81.220:30008/demo/index.jsp
访问成功表示dns成功
2.k8s集成heapster
heapster是kubernetes集群监控工具,在1.2的时候,kubernetes的监控需要在node节点上允许cadvisor作为agent收集本机和容器的资源数据,包括CPU、内存、网络、文件系统等,在新版的kubernetes中,cadvisor被集成到kubelet中,通过netstat就可以看到kubelet新开了一个4194的端口,这就是cadvisor监听的端口,现在我们可以通过http://nodeip:4194的方式访问到cadvisor,heapster就是通过每个node上的kubelet,也就是实际的cadvisor上收集数据并汇总,保存到后端存储中
heapster支持多种后端存储,包括influxdb、elasticsearch、kafka等
2.1.准备镜像
1)将镜像进行导入操作
[root@k8s-master ~]# mkdir heapster-influxdb
[root@k8s-master heapster-influxdb]# ls
docker_heapster_grafana.tar.gz docker_heapster.tar.gz
docker_heapster_influxdb.tar.gz
[root@k8s-master heapster-influxdb]# for i in `ls *.gz`
> do
> docker load -i $i
> done
2)打标签推送到harbor
[root@k8s-master heapster-influxdb]# docker tag docker.io/kubernetes/heapster_grafana:v2.6.0 192.168.81.240/k8s/heapster_grafana:v2.6.0
[root@k8s-master heapster-influxdb]# docker tag docker.io/kubernetes/heapster_influxdb:v0.5 192.168.81.240/k8s/heapster_influxdb:v0.5
[root@k8s-master heapster-influxdb]# docker tag docker.io/kubernetes/heapster:canary 192.168.81.240/k8s/heapster:canary
[root@k8s-master heapster-influxdb]# docker push 192.168.81.240/k8s/heapster
[root@k8s-master heapster-influxdb]# docker push 192.168.81.240/k8s/heapster_grafana
[root@k8s-master heapster-influxdb]# docker push 192.168.81.240/k8s/heapster_influxdb
2.2.准备heapster-controller.yaml文件
[root@k8s
-master heapster
-influxdb
]
apiVersion: v1
kind: ReplicationController
metadata:
labels:
k8s-app: heapster
name: heapster
version: v6
name: heapster
namespace: kube
-system
spec:
replicas: 1
selector:
k8s-app: heapster
version: v6
template:
metadata:
labels:
k8s-app: heapster
version: v6
spec:
containers:
- name: heapster
image: 192.168.81.240/k8s/heapster
:canary
imagePullPolicy: Always
command:
- /heapster
- --source=kubernetes
:http
://192.168.81.210
:8080
?inClusterConfig=false
- --sink=influxdb
:http
://monitoring
-influxdb
:8086
2.3.准备heapster-service.yaml文件
[root@k8s
-master heapster
-influxdb
]
apiVersion: v1
kind: Service
metadata:
labels:
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: Heapster
name: heapster
namespace: kube
-system
spec:
ports:
- port: 80
targetPort: 8082
selector:
k8s-app: heapster
2.4.准备influxdb-grafana-controller.yaml文件
[root@k8s-master heapster-influxdb]# vim influxdb-grafana-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: influxGrafana
name: influxdb-grafana
namespace: kube-system
spec:
replicas: 1
selector:
name: influxGrafana
template:
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: influxGrafana
name: influxdb-grafana
namespace: kube-system
spec:
replicas: 1
selector:
name: influxGrafana
template:
metadata:
labels:
name: influxGrafana
spec:
containers:
- name: influxdb
image: 192.168.81.240/k8s/heapster_influxdb:v0.5
volumeMounts:
- mountPath: /data
name: influxdb-storage
- name: grafana
image: 192.168.81.240/k8s/heapster_grafana:v2.6.0
env:
- name: INFLUXDB_SERVICE_URL
value: http://monitoring-influxdb:8086
# The following env variables are required to make Grafana accessible via
# the kubernetes api-server proxy. On production clusters, we recommend
# removing these env variables, setup auth for grafana, and expose the grafana
# service using a LoadBalancer or a public IP.
- name: GF_AUTH_BASIC_ENABLED
value: "false"
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ORG_ROLE
value: Admin
- name: GF_SERVER_ROOT_URL
value: /api/v1/proxy/namespaces/kube-system/services/monitoring-grafana/
volumeMounts:
- mountPath: /var
name: grafana-storage
volumes:
- name: influxdb-storage
emptyDir: {}
- name: grafana-storage
emptyDir: {}
2.5.准备grafana-service.yaml文件
[root@k8s-master heapster-influxdb]# vim grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: monitoring-grafana
name: monitoring-grafana
namespace: kube-system
spec:
# In a production setup, we recommend accessing Grafana through an external Loadbalancer
# or through a public IP.
# type: LoadBalancer
ports:
- port: 80
targetPort: 3000
selector:
name: influxGrafana
2.6.准备influxdb-service.yaml 文件
[root@k8s-master heapster-influxdb]# vim influxdb-service.yaml
apiVersion: v1
kind: Service
metadata:
labels: null
name: monitoring-influxdb
namespace: kube-system
spec:
ports:
- name: http
port: 8083
targetPort: 8083
- name: api
port: 8086
targetPort: 8086
selector:
name: influxGrafana
2.7.创建资源
1)创建资源
[root@k8s-master k8s]# kubectl create -f heapster-influxdb/
service "monitoring-grafana" created
replicationcontroller "heapster" created
service "heapster" created
replicationcontroller "influxdb-grafana" created
service "monitoring-influxdb" created
2)资源创建完成后,重启apiserver
[root@k8s-master k8s]# systemctl restart kube-apiserver.service
查看每个资源的使用情况