kubernetes学习记录(5)——服务发现机制与Cluster DNS的安装(无CA认证版)
来源:互联网 发布:淘宝系统架构 编辑:程序博客网 时间:2024/06/05 14:09
服务发现机制
Kubernetes提供了两种发现Service的方法:
1.环境变量
当Pod运行的时候,Kubernetes会将之前存在的Service的信息通过环境变量写到Pod中。
这种方法要求Pod必须要在Service之后启动。
在Service之前启动的Pod就不会有该Service的环境变量。
采用DNS的方式就没有这个限制。
2.DNS
当有新的Service创建时,就会自动生成一条DNS记录。
使用这种方法,需要安装Cluster DNS。
Kubernetes1.2.7版本下Cluster DNS的安装
阅读github上官方源码发现:
Cluster DNS自Kubernetes1.3版本开始,结构发生了变化。这里先以1.2.7版本作为研究。
1.2.7版本中,Cluster DNS主要包含如下几项:
1)SkyDNS
提供DNS解析服务。
2)Etcd
用于DNS的存储。
3)Kube2sky
监听Kubernetes,当有新的Service创建时,将其注册到etcd上。
4)healthz
提供对skydns服务的健康检查功能。
安装过程参考官方github文档。
在Master服务器上下载Kubernetes发布包
Cluster DNS在Kubernetes发布包的cluster/addons/dns目录下
yum -y install wgetwget https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.2.7tar zxvf v1.2.7cd kubernetes-1.2.7/cluster/addons/dns
需要注意,skydns服务使用的clusterIP需要我们指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址,不能通过Kuberneters自动给skydns分配。
通过环境变量,配置参数
export DNS_SERVER_IP="10.254.10.2"export DNS_DOMAIN="cluster.local"export DNS_REPLICAS=1
设置 Cluster DNS Service的IP为 10.254.10.2(不能和已分配的IP重复),Cluster DNS的本地域为 cluster.local。
修改每台Node上的kubelet启动参数
vim /etc/kubernetes/kubelet
在KUBELET_ARGS里增加:
--cluster_dns=10.254.10.2 --cluster_domain=cluster.local
cluster_dns为DNS服务的ClusterIP地址
cluster_domain为DNS服务中设置的域名
重启kubelet服务
systemctl restart kubelet
生成dns-rc.yaml和dns-svc.yaml
kubernetes-1.2.7/cluster/addons/dns目录下。
skydns-rc.yaml.in和skydns-svc.yaml.in是两个模板文件,通过设置的环境变量修改其中的相应属性值,可以生成Replication Controller和Service的定义文件。
生成Replication Controller的定义文件dns-rc.yaml创建RC
sed -e "s/{{ pillar\['dns_replicas'\] }}/${DNS_REPLICAS}/g;s/{{ pillar\['dns_domain'\] }}/${DNS_DOMAIN}/g" \skydns-rc.yaml.in > dns-rc.yaml
需要注意kube2sky需要ServiceAccount来调用Kubernetes API。
而ServiceAccount的使用需要对Kubernetes集群进行安全认证,否则可能会导致RC无法自动创建Pod等错误。
这里有两种解决办法:
(1)选择禁用ServiceAccount。编辑/etc/kubernetes/apiserver。
去除 KUBE_ADMISSION_CONTROL中的SecurityContextDeny,ServiceAccount,并重启kube-apiserver.service服务
#vim /etc/kubernetes/apiserverKUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"#systemctl restart kube-apiserver.service
而关闭ServiceAccount,需要在kube2sky显示指定Kubernetes API的URL
(2)对集群进行安全认证,参考kubernetes学习记录(9)——集群基于CA签名的安全设置 ,不需要对kube2sky显示指定Kubernetes API的URL
修改生成的dns-rc.yaml,设置Kube2sky的启动参数如下:
args: - --domain=cluster.local #如果已经进行CA认证,则可以不指定kube_master_url - --kube-master-url=http://192.168.121.143:8080
这里特别注意:
在设置Kube2sky的启动参数时
《Kubernetes实战》和某些技术博客中
将“- –domain”和“- –kube-master-url”错误地写成了“- -domain”和“ - -kube-master-url”,均少了一个“-”
导致,Kube2sky的pod在启动过程中,报CrashLoopBackOff的错误。
建议将dns-rc.yaml里镜像的下载地址gcr.io改成index.tenxcloud.com,能够加速下载。
最终的dns-rc.yaml如下
apiVersion: v1kind: ReplicationControllermetadata: name: kube-dns-v11 namespace: kube-system labels: k8s-app: kube-dns version: v11 kubernetes.io/cluster-service: "true"spec: replicas: 1 selector: k8s-app: kube-dns version: v11 template: metadata: labels: k8s-app: kube-dns version: v11 kubernetes.io/cluster-service: "true" spec: containers: - name: etcd image: index.tenxcloud.com/google_containers/etcd-amd64:2.2.1 resources: # TODO: Set memory limits when we've profiled the container for large # clusters, then set request = limit to keep this container in # guaranteed class. Currently, this container falls into the # "burstable" category so the kubelet doesn't backoff from restarting it. limits: cpu: 100m memory: 500Mi requests: cpu: 100m memory: 50Mi command: - /usr/local/bin/etcd - -data-dir - /var/etcd/data - -listen-client-urls - http://127.0.0.1:2379,http://127.0.0.1:4001 - -advertise-client-urls - http://127.0.0.1:2379,http://127.0.0.1:4001 - -initial-cluster-token - skydns-etcd volumeMounts: - name: etcd-storage mountPath: /var/etcd/data - name: kube2sky image: index.tenxcloud.com/google_containers/kube2sky:1.14 resources: # TODO: Set memory limits when we've profiled the container for large # clusters, then set request = limit to keep this container in # guaranteed class. Currently, this container falls into the # "burstable" category so the kubelet doesn't backoff from restarting it. limits: cpu: 100m # Kube2sky watches all pods. memory: 200Mi requests: cpu: 100m memory: 50Mi livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 readinessProbe: httpGet: path: /readiness port: 8081 scheme: HTTP # we poll on pod startup for the Kubernetes master service and # only setup the /readiness HTTP server once that's available. initialDelaySeconds: 30 timeoutSeconds: 5 args: # command = "/kube2sky" #特别注意 #- -domain=cluster.local是错误的写法 #- -kube-master-url=http://192.168.121.143:8080是错误的设置 #会导致CrashLoopBackOff的错误 #如果已经进行CA认证,则可以不指定kube-master-url - --domain=cluster.local - --kube-master-url=http://192.168.121.143:8080 - name: skydns image: index.tenxcloud.com/google_containers/skydns:2015-10-13-8c72f8c resources: # TODO: Set memory limits when we've profiled the container for large # clusters, then set request = limit to keep this container in # guaranteed class. Currently, this container falls into the # "burstable" category so the kubelet doesn't backoff from restarting it. limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 50Mi args: # command = "/skydns" - -machines=http://127.0.0.1:4001 - -addr=0.0.0.0:53 - -ns-rotate=false - -domain=cluster.local. ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP - name: healthz image: index.tenxcloud.com/google_containers/exechealthz:1.0 resources: # keep request = limit to keep this container in guaranteed class limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi args: - -cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null - -port=8080 ports: - containerPort: 8080 protocol: TCP volumes: - name: etcd-storage emptyDir: {} dnsPolicy: Default # Don't use cluster DNS.
通过定义文件dns-rc.yaml创建Cluster DNS Replication Controller
kubectl create -f dns-rc.yaml
验证Cluster DNS Pod是否创建运行成功:
kubectl get pod --namespace=kube-system -o wide
生成Service的定义文件dns-svc.yaml创建Service
sed -e "s/{{ pillar\['dns_server'\] }}/${DNS_SERVER_IP}/g" \skydns-svc.yaml.in > dns-svc.yaml
apiVersion: v1kind: Servicemetadata: 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.10.2 ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP
根据dns-svc.yaml创建Cluster DNS Service
kubectl create -f dns-svc.yaml
查询验证Cluster DNS Service
kubectl get svc --namespace=kube-system -o wide
创建Pod验证Cluster DNS
使用一个带有nslookup的工具来验证DNS是否能够正常工作:
busybox.yaml
apiVersion: v1kind: Podmetadata: name: busybox namespace: defaultspec: containers: - name: busybox image: index.tenxcloud.com/google_containers/busybox command: - sleep - "3600"
#kubectl create -f busybox.yaml#kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local
发现报错
Error from server: error dialing backend: dial tcp 192.168.121.144:10250: getsockopt: connection refused
调试解决该问题的过程:
1)在192.168.121.144上执行
ip addr
发现没有flanneld网桥。
《kubernetes学习记录(4)——创建kubernetes覆盖网络》忘记设置flanneld开机自启了,博客中已修改。
重启flanneld网桥,仍报错。
(所以这里flanneld是否需要开机自启还不确定)
2)在Master上执行
#curl 192.168.121.144:10250curl: (7) Failed connect to 192.168.121.144:10250; Connection refused
端口无法连接。
10250是kubelet的端口。
在Node上检查/etc/kubernetes/kubelet。
经过多方对比和测试发现。
KUBELET_ADDRESS需要修改为node ip。
最终的/etc/kubernetes/kubelet内容(未经过CA验证版)如下:
KUBELET_ADDRESS="--address=192.168.121.145"# The port for the info server to serve on# KUBELET_PORT="--port=10250"# You may leave this blank to use the actual hostnameKUBELET_HOSTNAME="--hostname-override=192.168.121.145"# location of the api-serverKUBELET_API_SERVER="--api-servers=http://192.168.121.143:8080"# pod infrastructure containerKUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"# Add your own!KUBELET_ARGS="--cluster_dns=10.254.10.2 --cluster_domain=cluster.local"
重启kubelet。
最后重新执行
kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local
总结
网上的各种安装教程和配置教程多多少少都存在一些问题,不能完全相信书籍和教程,我的博客里估计也有很多的坑。慢慢学习中。
- kubernetes学习记录(5)——服务发现机制与Cluster DNS的安装(无CA认证版)
- Kubernetes DNS服务的安装与配置
- kubernetes学习记录(9)——集群基于CA签名的安全设置
- kubernetes学习记录(2)——基于Centos7.2的kubernetes集群自动安装与配置
- kubernetes学习记录(13)——网上集群基于CA签名安全设置的两种方式对比
- kubernetes二进制部署时ca认证排错记录
- kubernetes学习记录(1)——kubernetes初理解
- 关于kubernetes 的 服务发现
- kubernetes学习记录(8)——中文界面版dashboard安装
- Kubernetes如何使用kube-dns实现服务发现
- Kubernetes如何使用kube-dns实现服务发现
- Kubernetes(k8s)如何使用kube-dns实现服务发现
- Kubernetes(k8s)如何使用kube-dns实现服务发现
- kubernetes 服务发现与注册个人想法
- Mongre cluster服务的安装与配置
- kubernetes工作记录(1)——kubernetes1.7.4版集群的离线安装搭建过程记录
- Kubernetes DNS服务配置
- CentOS7安装kubernetes cluster
- Google VR开发-Cardboard VR SDK头部追踪实现(牵涉到的抽象模型)
- HTTPS with Client Certificates on Android
- 数据结构之树的应用梳理(一)二叉排序树
- Kotlin Reference (五) Packages
- SAP ERP系统业务优化之采购订单追踪
- kubernetes学习记录(5)——服务发现机制与Cluster DNS的安装(无CA认证版)
- 使用job自动抓取网页数据发送邮件,以springboot服务启动
- Oracle序列
- 归并排序
- h5 video 追加
- Springmvc工作流程
- hdu6052 To my boyfriend 枚举
- SAP ERP业务优化之非计划运输成本核算
- sqlserver和oracle常用函数对比