1. 部署 KubeDNS 插件
官方的配置文件中包含以下镜像:
kube-dns ----监听service、pod等资源,动态更新DNS记录
sidecar ----用于监控和健康检查
dnsmasq ----用于缓存,并可从dns服务器获取dns监控指标
地址:
https://github.com/kubernetes/dns
官方的yaml文件目录:kubernetes/cluster/addons/dns
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns
系统预定义的 RoleBinding
预定义的 RoleBinding system:kube-dns 将 kube-system 命名空间的 kube-dns ServiceAccount 与 system:kube-dns Role 绑定, 该 Role 具有访问 kube-apiserver DNS 相关 API 的权限。
#kubectlgetclusterrolebindingssystem:kube-dns-oyamlapiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:annotations:rbac.authorization.kubernetes.io/autoupdate:"true"creationTimestamp:2017-10-31T10:30:29Zlabels:kubernetes.io/bootstrapping:rbac-defaultsname:system:kube-dnsresourceVersion:"77"selfLink:/apis/rbac.authorization.k8s.io/v1/clusterrolebindings/system%3Akube-dnsuid:8483eb4f-be26-11e7-853b-000c297aff5droleRef:apiGroup:rbac.authorization.k8s.iokind:ClusterRolename:system:kube-dnssubjects:-kind:ServiceAccountname:kube-dnsnamespace:kube-system
下载 Kube-DNS 相关 yaml 文件
#mkdirdns&&cddns#curl-Ohttps://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/dns/kube-dns.yaml.base
修改后缀
#cpkube-dns.yaml.basekube-dns.yaml
替换所有的 images
#sed-i's/gcr.io\/google_containers/192.168.100.100\/k8s/g'kubedns-dns.yaml#sed-i"s/__PILLAR__DNS__SERVER__/10.254.0.2/g"kube-dns.yaml#sed-i"s/__PILLAR__DNS__DOMAIN__/cluster.local/g"kube-dns.yaml#diffkube-dns.yamlkube-dns.yaml.base33c33<clusterIP:10.254.0.2--->clusterIP:__PILLAR__DNS__SERVER__97c97<image:192.168.100.100/k8s/k8s-dns-kube-dns-amd64:1.14.5--->image:gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.7127,128c127<---domain=cluster.local.<---kube-master-url=http://192.168.100.102:8080--->---domain=__PILLAR__DNS__DOMAIN__.149c148<image:192.168.100.100/k8s/k8s-dns-dnsmasq-nanny-amd64:1.14.5--->image:gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.7169c168<---server=/cluster.local/127.0.0.1#10053--->---server=/__PILLAR__DNS__DOMAIN__/127.0.0.1#10053188c187<image:192.168.100.100/k8s/k8s-dns-sidecar-amd64:1.14.5--->image:gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.7201,202c200,201<---probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,A<---probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,A--->---probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,SRV>---probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,SRV
说明:
这里的镜像我替换为自己部署的镜像仓库:如需部署私有镜像仓库,请参考Harbor镜像仓库部署。
也可以在这里下载镜像:
hub.c.163.com/zhijiansd/k8s-dns-kube-dns-amd64:1.14.7
hub.c.163.com/zhijiansd/k8s-dns-sidecar-amd64:1.14.7
hub.c.163.com/zhijiansd/k8s-dns-dnsmasq-nanny-amd64:1.14.7
在我部署 kube-dns 时使用的是1.14.5版本,这时将域名解析记录由 SRV记录 更改为 A记录(使用1.14.7版本不用更改)。
执行该文件
#kubectlcreate-fkube-dns.yamlservice"kube-dns"createdserviceaccount"kube-dns"createdconfigmap"kube-dns"createddeployment"kube-dns"created
查看 KubeDNS 服务
#kubectlgetpods-nkube-system###查看kube-system下的podNAMEREADYSTATUSRESTARTSAGEkube-dns-7c7674cf68-lcgvc3/3Running05m#kubectlgetall--namespace=kube-system#kubectlgetall-nkube-systemNAMEDESIREDCURRENTUP-TO-DATEAVAILABLEAGEdeploy/kube-dns11117mNAMEDESIREDCURRENTREADYAGErs/kube-dns-7c7674cf681117mNAMEDESIREDCURRENTUP-TO-DATEAVAILABLEAGEdeploy/kube-dns11117mNAMEDESIREDCURRENTREADYAGErs/kube-dns-7c7674cf681117mNAMEREADYSTATUSRESTARTSAGEpo/kube-dns-7c7674cf68-lcgvc3/3Running07mNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEsvc/kube-dnsClusterIP10.254.0.2<none>53/UDP,53/TCP7m#kubectlcluster-info###查看集群信息Kubernetesmasterisrunningathttps://192.168.100.102:6443KubeDNSisrunningathttps://192.168.100.102:6443/api/v1/namespaces/kube-system/services/kube-dns/proxy#kubectlgetservices--all-namespaces|grepdns###查看集群服务kube-systemkube-dnsClusterIP10.254.0.2<none>53/UDP,53/TCP8m#kubectlgetservices-nkube-system|grepdnskube-dnsClusterIP10.254.0.2<none>53/UDP,53/TCP9m
查看 KubeDNS 守护程序的日志(如果 kube-dns 有pod没有起来或者报错可以使用如下命令排错)
#kubectllogs--namespace=kube-system$(kubectlgetpods--namespace=kube-system-lk8s-app=kube-dns-oname)-ckubedns#kubectllogs--namespace=kube-system$(kubectlgetpods--namespace=kube-system-lk8s-app=kube-dns-oname)-cdnsmasq#kubectllogs--namespace=kube-system$(kubectlgetpods--namespace=kube-system-lk8s-app=kube-dns-oname)-csidecar
检查 kube-dns 功能
a.编写 yaml 文件
#vimmy-nginx.yamlapiVersion:extensions/v1beta1###API版本kind:Deployment###指定创建资源的角色/类型metadata:###资源的元数据/属性name:my-nginx###资源名字,同一个namespace中必须唯一spec:###详细定义该资源replicas:1###指定rc中pod的个数template:###指定rc中pod的模板,rc中的pod都按该模板创建metadata:###指定rc中pod的元数据labels:###设定资源的标签run:my-nginx###标签以key/value的结构存在spec:containers:###指定资源中的容器-name:my-nginx###容器名image:192.168.100.100/library/nginx:1.13.0###容器使用的镜像地址ports:###端口映射列表-containerPort:80###容器需要暴露的端口
b. 执行该文件并查看pod
#kubectlcreate-fmy-nginx.yamldeployment"my-nginx"created#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEmy-nginx-7bd7b4dbf-kkbrb1/1Running021s
c. 生成服务
#kubectlexposedeploymentmy-nginx--type=NodePort--name=my-nginxservice"my-nginx"exposed#kubectldescribesvcmy-nginx|grepNodePort
d. 测试 kube-dns 服务
#kubectlexec-itmy-nginx-7bd7b4dbf-kkbrb--/bin/bashroot@my-nginx-7bd7b4dbf-kkbrb:/#cat/etc/resolv.confnameserver10.254.0.2searchdefault.svc.cluster.local.svc.cluster.local.cluster.local.localdomainoptionsndots:5root@my-nginx-7bd7b4dbf-kkbrb:/#ping-c1my-nginxPINGmy-nginx.default.svc.cluster.local(10.254.35.229):56databytes---my-nginx.default.svc.cluster.localpingstatistics---1packetstransmitted,0packetsreceived,100%packetlossroot@my-nginx-7bd7b4dbf-kkbrb:/#ping-c1kube-dns.kube-system.svc.cluster.localPINGkube-dns.kube-system.svc.cluster.local(10.254.0.2):56databytes---kube-dns.kube-system.svc.cluster.localpingstatistics---1packetstransmitted,0packetsreceived,100%packetlossroot@my-nginx-7bd7b4dbf-kkbrb:/#ping-c1kubernetesPINGkubernetes.default.svc.cluster.local(10.254.0.1):56databytes---kubernetes.default.svc.cluster.localpingstatistics---1packetstransmitted,0packetsreceived,100%packetloss
2. 部署 Heapster 组件
Heapster 是容器集群监控和性能分析工具,天然的支持 Kubernetes 和 CoreOS。
在每个kubernetes Node上都会运行 Kubernetes 的监控agent---cAdvisor,它会收集本机以及容器的监控数据(cpu,memory,filesystem,network,uptime)。
cAdvisor web界面访问地址: http://< Node-IP >:4194
Heapster 是一个收集者,将每个 Node 上的 cAdvisor 的数据进行汇总,然后导到第三方工具(如InfluxDB)。
heapter+influxdb+grafana。heapter用来采集信息,influxdb用来存储,而grafana用来展示信息。
官方配置文件中包含如下镜像:
heapster
heapster-grafana
heapster-influxdb
官方地址:
https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/
下载 heapster
#wgethttps://codeload.github.com/kubernetes/heapster/tar.gz/v1.5.0-beta.0-Oheapster-1.5.0-beta.tar.gz#tar-zxvfheapster-1.5.0-beta.tar.gz#cdheapster-1.5.0-beta.0/deploy/kube-config#cprbac/heapster-rbac.yamlinfluxdb/#cdinfluxdb/#lsgrafana.yamlheapster-rbac.yamlheapster.yamlinfluxdb.yaml
更换镜像地址并执行文件
#sed-i's/gcr.io\/google_containers/192.168.100.100\/k8s/g'*.yaml#kubectlcreate-f.deployment"monitoring-grafana"createdservice"monitoring-grafana"createdclusterrolebinding"heapster"createdserviceaccount"heapster"createddeployment"heapster"createdservice"heapster"createddeployment"monitoring-influxdb"createdservice"monitoring-influxdb"created
安装heapster涉及的镜像下载地址:
hub.c.163.com/zhijiansd/heapster-amd64:v1.4.0
hub.c.163.com/zhijiansd/heapster-grafana-amd64:v4.4.3
hub.c.163.com/zhijiansd/heapster-influxdb-amd64:v1.3.3
检查执行结果
#kubectlgetdeployments-nkube-system|grep-E'heapster|monitoring'heapster11111mmonitoring-grafana11111mmonitoring-influxdb11111m
检查 Pods
#kubectlgetpods-nkube-system|grep-E'heapster|monitoring'###查看podsheapster-d7f5dc5bf-k2c5v1/1Running02mmonitoring-grafana-98d44cd67-nfmmt1/1Running02mmonitoring-influxdb-6b6d749d9c-6q99p1/1Running02m#kubectlgetsvc-nkube-system|grep-E'heapster|monitoring'###查看servicesheapsterClusterIP10.254.198.254<none>80/TCP2mmonitoring-grafanaClusterIP10.254.73.182<none>80/TCP2mmonitoring-influxdbClusterIP10.254.143.75<none>8086/TCP2m#kubectlcluster-info###查看集群信息Kubernetesmasterisrunningathttps://192.168.100.102:6443Heapsterisrunningathttps://192.168.100.102:6443/api/v1/namespaces/kube-system/services/heapster/proxyKubeDNSisrunningathttps://192.168.100.102:6443/api/v1/namespaces/kube-system/services/kube-dns/proxymonitoring-grafanaisrunningathttps://192.168.100.102:6443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxymonitoring-influxdbisrunningathttps://192.168.100.102:6443/api/v1/namespaces/kube-system/services/monitoring-influxdb/proxy
浏览器访问grafana:
https://master:6443/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
集群中node节点监控信息如下====>
pod相关监控信息如下===>
部署 Kubernetes Dashboard
官方文件地址:
https://github.com/kubernetes/dashboard/tree/master/src/deploy/
如下对访问控制的解释是我自行翻译的,看不懂的请访问下面的wiki页自行了解:
从 kubernetes-dashboard 1.7.0 开始只授予了最小的管理权限。
授权由Kubernetes API服务器处理。仪表板仅作为一个代理,并将所有的auth信息传递给它。如果禁止访问,相应的警告将显示在仪表板中。
WiKi: https://github.com/kubernetes/dashboard/wiki
默认的 Dashboard 权限:
1.在 kube-system 命名空间下 create 的权限,以创建 kubernet-dashboard-key-holder 权限
2.获取,更新和删除 kube-system 命名空间中名为 kubernetes-dashboard-key-holder 和 kubernetes-dashboard-certs 的权限
3.获取和更新 kube-system 命名空间中名为 kubernetes-dashboard-settings 的配置映射的权限
4.代理权限,以允许从 heapster 获取数据
认证授权
仪表板支持基于:
1.Authorization: Bearer <token>
2.Bearer Token
3.Username/password
4.Kubeconfig
登录
Login 视图已在1.7版本中引入,需要通过HTTPS启用和访问仪表板。通过HTTPS启用 --tls-cert-file 和 --tls-cert-key 选项到仪表板。HTTPS端口将在仪表板容器的8443端口上开放,可以通过 --port 来更改。
使用 Skip 选项将使仪表板使用 Service Account 权限登录。
授权
a.使用Authorization header是使仪表板作为用户访问HTTP的唯一方法
要使Dashboard使用授权标题,只需将每个请求中的Authorization:Bearer <token>传递给Dashboard。这可以通过在仪表板前配置反向代理来实现。代理将负责身份提供者的身份验证,并将请求头中生成的令牌传递给仪表板。请注意,Kubernetes API服务器需要正确配置才能接受这些令牌。
注:如果通过API服务器代理访问仪表板,授权标头将不起作用。访问仪表板指南中描述的kubectl代理和API服务器访问仪表板的方式将不起作用。这是因为,一旦请求到达API服务器,所有额外的头文件被丢弃。
查看 Token
#kubectl-nkube-systemgetsecretNAMETYPEDATAAGEdefault-token-qgzzxkubernetes.io/service-account-token36hheapster-token-kh678kubernetes.io/service-account-token35hkube-dns-token-jkwbfkubernetes.io/service-account-token35hkubernetes-dashboard-certsOpaque26hkubernetes-dashboard-key-holderOpaque26hkubernetes-dashboard-token-x76k5kubernetes.io/service-account-token36h
b.Bearer Token
参考Kubernetes身份验证文档:
https://kubernetes.io/docs/admin/authentication/
c.Basic
默认情况下,Basic authentication是禁用的。原因是Kubernetes API服务器需要配置授权模式 ABAC 和 --basic-auth-file。如果没有这个API服务器自动退回到anonymous匿名用户,那么就没有办法检查提供的凭证是否有效。
为了在仪表板中启用基本的auth,必须配置--authentication-mode=basic命令。默认情况下,设置为--authentication-mode=token。
d.Kubeconfig
为方便起见,提供了这种登录方法。在kubeconfig文件中只支持由--authentication-mode命令指定的身份验证选项。如果配置为使用其他方式,则将在仪表板中显示错误。此时不支持外部身份验证程序或基于证书的身份验证。
5.Admin privileges
向仪表板的服务帐户授予管理员权限可能是一种安全风险。
您可以通过在ClusterRoleBinding下创建一个完整的管理特权来授予Dashboard的服务帐户。根据选择的安装方法复制YAML文件,并保存为例如dashboard-admin.yaml。使用kubectl create -f dashboard-admin.yaml部署它。之后,可以在登录页面上使用Skip选项来访问仪表板。
#vimdashboard-admin.yamlapiVersion:rbac.authorization.k8s.io/v1beta1kind:ClusterRoleBindingmetadata:name:kubernetes-dashboardlabels:k8s-app:kubernetes-dashboardroleRef:apiGroup:rbac.authorization.k8s.iokind:ClusterRolename:cluster-adminsubjects:-kind:ServiceAccountname:kubernetes-dashboardnamespace:kube-system
官方配置文件中包含如下镜像:
kubernetes-dashboard-init(注:该镜像只在1.7版本中出现)
kubernetes-dashboard
A.官方推荐版,更严格的权限控制
#curl-Ohttps://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
B.延续之前版本的新版本
#curl-Ohttps://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml
替换 images 并执行文件
#sed-i's/gcr.io\/google_containers/192.168.100.100\/k8s/g'kubernetes-dashboard.yaml#kubectlcreate-fkubernetes-dashboard.yamlsecret"kubernetes-dashboard-certs"createdserviceaccount"kubernetes-dashboard"createdrole"kubernetes-dashboard-minimal"createdrolebinding"kubernetes-dashboard-minimal"createddeployment"kubernetes-dashboard"createdservice"kubernetes-dashboard"created
安装kubernetes-dashboard使用的镜像下载地址:
hub.c.163.com/zhijiansd/kubernetes-dashboard-amd64:v1.8.0
查看相关信息
#kubectlgetpods-nkube-system|grepdash###查看podkubernetes-dashboard-7cc94ffffd-n55lf1/1Running033s#kubectlgetpod-owide--all-namespaces###查看pod状况和其所分布节点NAMESPACENAMEREADYSTATUSRESTARTSAGEIPNODEdefaultmy-nginx-7bd7b4dbf-b6m6q1/1Running112h10.254.95.2node2kube-systemheapster-d7f5dc5bf-8v4521/1Running112h10.254.59.2node1kube-systemkube-dns-84cc5f56fb-m2h4d3/3Running312h10.254.80.2masterkube-systemkubernetes-dashboard-78b55c9d4d-bdbp61/1Running112h10.254.95.3node2kube-systemmonitoring-grafana-98d44cd67-vlc4s1/1Running112h10.254.80.3masterkube-systemmonitoring-influxdb-6b6d749d9c-lh9ln1/1Running112h10.254.59.3node1#kubectltopnode-nkube-system###显示CPU、内存、和存储使用状况(需安装heapster)NAMECPU(cores)CPU%MEMORY(bytes)MEMORY%master377m4%587Mi7%node1185m2%371Mi4%node2167m2%326Mi4%#kubectltoppod-nkube-systemNAMECPU(cores)MEMORY(bytes)monitoring-influxdb-6b6d749d9c-lh9ln3m45Miheapster-d7f5dc5bf-8v4525m34Mikube-dns-84cc5f56fb-m2h4d5m36Mikubernetes-dashboard-78b55c9d4d-bdbp62m22Mimoni