您现在的位置是: 网站首页 >Kubernetes >Docker&Kubernetes技术全解 Kubernetes
【K8s+Docker技术全解】02.k8s搭建环境准备-准备DNS服务
admin2020年10月7日 21:39 【Docker | Kubernetes | Linux 】 1210人已围观
Docker&Kubernetes技术全解简介 Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 课程来自老男孩教育学习总结。
# k8s搭建环境准备 配置5台虚拟机,IP信息如下 | 主机名 | IP | 用途、软件及监听端口 | | ------------------------ | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | k8s99-101 | 192.168.99.101 | DNS服务:bind9【53(udp/tcp)】、四层负载均衡->kube-apiserver:nginx【7443】、Nginx高可用主VIP:keepalived【vrrp】、七层代理->traefik:nginx【80】、 七层代理->dashboard:nginx【443】 | | k8s99-102 | 192.168.99.102 | 主etcd节点:etcd【2379,2380】、四层负载均衡->kube-apiserver:nginx【7443】、Nginx高可用备VIP:keepalived【vrrp】、七层代理->traefik:nginx【80】、 七层代理->dashboard:nginx【443】 | | k8s99-151 | 192.168.99.151 | Docker:docker-ce、备etcd节点:etcd【2379,2380】、kube-apiserver【6443】、controller-manager【10252,10257】、kube-scheduler【10251,10259】、kubelet【10250,10255】、kube-proxy【10256】、CNI网络插件:flannel【2401】、服务发现插件:coredns、服务暴露插件:traefik【81】 | | k8s99-152 | 192.168.99.152 | Docker:docker-ce、备etcd节点:etcd【2379,2380】、kube-apiserver【6443】、controller-manager【10252,10257】、kube-scheduler【10251,10259】、kubelet【10250,10255】、kube-proxy【10256】、CNI网络插件:flannel【2401】、服务暴露插件:traefik【81】、GUI资源管理插件:dashboard【443】 | | k8s99-200(运维管理主机) | 192.168.99.200 | 证书签发:cfssl、Docker:docker-ce、本地Docker仓库:harbor【180(tcp)】、七层代理Harbor:nginx【80】 | | VIP | 192.168.99.100 | keepalived的vip in 101&102 | ![BLOG_20201007_220227_69](/media/blog/images/2020/10/BLOG_20201007_220227_69.png "博客图集BLOG_20201007_220227_69.png") ![BLOG_20201007_233041_18](/media/blog/images/2020/10/BLOG_20201007_233041_18.png "博客图集BLOG_20201007_233041_18.png") ## 环境依赖配置 暂时关闭所有系统的firewall:`systemctl stop firewalld`,也可以不关,注意开放端口访问 安装eple源:`yum install epel-release -y` 安装常用工具:`yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils -y` 使用`hostname set-hostname k8s99-101`设置主机名,修改`/etc/sysconfig/network-scripts/ifcfg-ens33`设置ip ## 99.101搭建DNS服务 部署自建DNS系统,域的名字和IP地址做绑定,通过服务的名字在集群内进行服务相互访问。 ### 为什么要部署DNS kubernetes 提供了 service 的概念可以通过 VIP(Service IP 是 virtual IP(VIP)) 访问 pod 提供的服务,但是在使用的时候还有一个问题:怎么知道某个应用的 VIP?比如我们有两个应用,一个 app,一个 是 db,每个应用使用 rc或deployment进行管理,并通过 service 暴露出端口提供服务。app 需要连接到 db 应用,我们只知道 db 应用的名称,但是并不知道它的 VIP 地址。这就涉及到了“服务发现”的问题了。 针对以上问题,k8s提供了三种“服务发现”的方法: - 方法1.通过kubernetes 提供的 API 查询 该方法较为简单,但问题较多。首先每个应用都要在启动的时候编写查询依赖服务的逻辑,这本身就是重复和增加应用的复杂度;其次这也导致应用需要依赖 kubernetes,不能够单独部署和运行(当然如果通过增加配置选项也是可以做到的,但这又是增加复杂度)。 - 方法2.环境变量 K8S默认支持,这一方法是参照docker的。每个 pod 启动时候,k8s会将之前存在的所有服务的 IP 和 port 信息通过环境变量的形式写入到新启动的pod中,这样 pod中的应用可以通过读取环境变量来获取依赖服务的地址信息。但是有个很大的问题:依赖的服务必须在 pod 启动之前就存在,不然就不会出现在环境变量中。 - 方法3.DNS(最理想的方案) 应用只需要知道服务的具体名字,不需要关心服务的实际的 ip 地址,中间的“服务名--IP”转换由DNS自动完成。名字和 ip 之间的转换就是 DNS 系统的功能。 ### 99.101安装bind9 ```bash [root@k8s99-101 ~]# yum install bind -y [root@k8s99-101 ~]# rpm -qa bind bind-9.11.4-16.P2.el7_8.3.x86_64 ``` #### 主配置文件 ```bash [root@k8s99-101 ~]# vim /etc/named.conf # 修改option中的设置 # listen-on port 53 { 127.0.0.1; };# 修改监听IP listen-on port 53 {192.168.99.101; }; # listen-on-v6 port 53 { ::1; };# 不使用ipv6 # ... # allow-query { localhost; };# 只允许本机查询dns allow-query { any; }; # 添加一行 forwarders { 192.168.99.2; }; # 本机未查到往上级查询,配置为VMware NAT的网关 # ... recursion yes; # 以递归方式进行查询(查询方式有递归和迭代) # dnssec-enable yes; # dnssec-validation yes; # 实验环境可以关闭dns安全相关 dnssec-enable no; dnssec-validation no; ``` 检查dns配置 ```bash [root@k8s99-101 ~]# named-checkconf # 如果没有报错,表明dns配置正确 ``` #### 区域配置文件 需要配置主机域(域名自定义,假的域)和业务域,主机域不应该业务域的域名相同。 生产环境规划主机名最好与业务无关,推荐使用地域+IP段的后两组 编辑配置文件,在后面添加下面两个域 ```bash [root@k8s99-101 ~]# vim /etc/named.rfc1912.zones # ... zone "host.com" IN { type master; file "host.com.zone"; allow-update { 192.168.99.101; }; }; zone "study.com" IN { type master; file "study.com.zone"; allow-update { 192.168.99.101; }; }; ``` `host.com`为主机域,`study.com`为业务域,注意格式一定要正确。 `allow-update`表示只允许本机更新。 #### 区域数据文件 编辑主机域区域文件 ```bash [root@k8s99-101 ~]# vim /var/named/host.com.zone # 写入以下内容 $ORIGIN host.com. $TTL 600 ; 过期时间10分钟 @ IN SOA dns.host.com. dnsadmin.host.com. ( 2020020201 ; serial 10800 ; refresh(3小时) 900 ; retry(15分钟) 604800 ; expire(1周) 86400 ) ; minimum(1天) NS dns.host.com. $TTL 60 ; 过期时间1分钟 dns A 192.168.99.101 k8s99-101 A 192.168.99.101 k8s99-102 A 192.168.99.102 k8s99-151 A 192.168.99.151 k8s99-152 A 192.168.99.152 k8s99-200 A 192.168.99.200 ``` 编辑业务域配置文件 ```bash [root@k8s99-101 ~]# vim /var/named/study.com.zone $ORIGIN study.com. $TTL 600 ; 过期时间10分钟 @ IN SOA dns.study.com. dnsadmin.study.com. ( 2020020201 ; serial 10800 ; refresh(3小时) 900 ; retry(15分钟) 604800 ; expire(1周) 86400 ) ; minimum(1天) NS dns.study.com. $TTL 60 ; 过期时间1分钟 dns A 192.168.99.101 ``` serial需要为10位,表示改日期的第一条记录。分裂有SOA、NS、A记录 检查配置文件 ```bash [root@k8s99-101 ~]# named-checkconf # 无报错 ``` #### 启动dns服务并查看named状态 ```bash [root@k8s99-101 ~]# systemctl start named [root@k8s99-101 ~]# systemctl status named ● named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled) Active: active (running) since 一 2020-06-01 17:38:41 CST; 7s ago Process: 1665 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS) Process: 1662 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS) Main PID: 1667 (named) CGroup: /system.slice/named.service └─1667 /usr/sbin/named -u named -c /etc/named.conf 6月 01 17:38:41 k8s99-101 named[1667]: zone study.com/IN: loaded serial 2020020201 6月 01 17:38:41 k8s99-101 named[1667]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0 6月 01 17:38:41 k8s99-101 named[1667]: zone localhost/IN: loaded serial 0 6月 01 17:38:41 k8s99-101 named[1667]: zone host.com/IN: loaded serial 2020020201 6月 01 17:38:41 k8s99-101 named[1667]: zone localhost.localdomain/IN: loaded serial 0 6月 01 17:38:41 k8s99-101 named[1667]: all zones loaded 6月 01 17:38:41 k8s99-101 named[1667]: running 6月 01 17:38:41 k8s99-101 systemd[1]: Started Berkeley Internet Name Domain (DNS). 6月 01 17:38:41 k8s99-101 named[1667]: resolver priming query complete 6月 01 17:38:41 k8s99-101 named[1667]: managed-keys-zone: No DNSKEY RRSIGs found for '.': success ``` #### 设置named开机启动 ```bash [root@k8s99-101 ~]# systemctl enable named Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service. ``` #### 防火墙允许named端口 ```bash # 查看监听的端口 [root@k8s99-101 ~]# netstat -luntp | grep :53 tcp 0 0 192.168.99.101:53 0.0.0.0:* LISTEN 1667/named udp 0 0 192.168.99.101:53 0.0.0.0:* 1667/named # 需要允许53的tcp和udp端口才能被访问 [root@k8s99-101 ~]# firewall-cmd --zone=public --add-port=53/tcp --permanent success [root@k8s99-101 ~]# firewall-cmd --zone=public --add-port=53/udp --permanent success [root@k8s99-101 ~]# firewall-cmd --reload success ``` 使用dig检查主机域和业务域 ```bash [root@k8s99-101 ~]# dig -t A k8s99-101.host.com @192.168.99.101 +short 192.168.99.101 [root@k8s99-101 ~]# dig -t A k8s99-152.host.com @192.168.99.101 +short 192.168.99.152 ``` ### 修改所有主机的DNS #### 修改named服务本机的DNS 将本机的DNS地址修改为配置了DNS的主机IP `192.168.99.101` ```bash [root@k8s99-101 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 [root@k8s99-101 ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep DNS DNS1=192.168.99.101 [root@k8s99-101 ~]# systemctl restart network # 测试解析内网和公网服务 [root@k8s99-101 ~]# systemctl restart network [root@k8s99-101 ~]# nslookup www.baidu.com Server: 192.168.99.101 Address: 192.168.99.101#53 Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 39.156.66.18 Name: www.a.shifen.com Address: 39.156.66.14 [root@k8s99-101 ~]# nslookup k8s99-151.host.com Server: 192.168.99.101 Address: 192.168.99.101#53 Name: k8s99-151.host.com Address: 192.168.99.151 ``` #### 配置主机域的短域名 也就是直接使用`ping 主机名`而不是`ping 主机名.host.com` ```bash # 配置短域名,添加search host.com [root@k8s99-101 ~]# vim /etc/resolv.conf [root@k8s99-101 ~]# cat /etc/resolv.conf # Generated by NetworkManager nameserver 192.168.99.101 search host.com # ping短域名也可以可以的 [root@k8s99-101 ~]# ping -c 1 k8s99-101 PING k8s99-101.host.com (192.168.99.101) 56(84) bytes of data. 64 bytes from k8s99-101 (192.168.99.101): icmp_seq=1 ttl=64 time=0.008 ms [root@k8s99-101 ~]# ping -c 1 k8s99-101.host.com PING k8s99-101.host.com (192.168.99.101) 56(84) bytes of data. 64 bytes from k8s99-101 (192.168.99.101): icmp_seq=1 ttl=64 time=0.009 ms ``` 对于短域名,可以直接使用`ping 主机名`,主机域使用短域名较多,而业务域往往不使用短域名,因为业务域太多了,比如多个域名`www.ts.com`、`www.sm.com`,这时用`ping www`肯定不行的,所以业务域需要使用域名名称。 然后修改另外几台 ```bash [root@k8s99-102 ~]# sed -i 's/DNS1=114.114.114.114/DNS1=192.168.99.101/g' /etc/sysconfig/network-scripts/ifcfg-ens33 && cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep DNS && systemctl restart network DNS1=192.168.99.101 [root@k8s99-102 ~]# sed -i '2a search host.com' /etc/resolv.conf && grep 'search' /etc/resolv.conf search host.com [root@k8s99-151 ~]# sed -i 's/DNS1=114.114.114.114/DNS1=192.168.99.101/g' /etc/sysconfig/network-scripts/ifcfg-ens33 && cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep DNS && systemctl restart network DNS1=192.168.99.101 [root@k8s99-151 ~]# sed -i '2a search host.com' /etc/resolv.conf && grep 'search' /etc/resolv.conf search host.com [root@k8s99-152 ~]# sed -i 's/DNS1=114.114.114.114/DNS1=192.168.99.101/g' /etc/sysconfig/network-scripts/ifcfg-ens33 && cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep DNS && systemctl restart network DNS1=192.168.99.101 [root@k8s99-152 ~]# sed -i '2a search host.com' /etc/resolv.conf && grep 'search' /etc/resolv.conf search host.com [root@k8s99-200 ~]# sed -i 's/DNS1=114.114.114.114/DNS1=192.168.99.101/g' /etc/sysconfig/network-scripts/ifcfg-ens33 && cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep DNS && systemctl restart network DNS1=192.168.99.101 [root@k8s99-200 ~]# sed -i '2a search host.com' /etc/resolv.conf && grep 'search' /etc/resolv.conf search host.com ``` #### 重启网卡短域名失效问题 !!!如果使用`systemctl restart network`或重启主机后`/etc/resolv.conf`中的`search`丢失,参考[这篇文章](https://www.cnblogs.com/forever521Lee/p/12011871.html)进行配置 也可以在CentOS开机自动添加,在`/etc/rc.d/rc.local`中设置 ```bash [root@k8s99-101 ~]# vim /etc/rc.d/rc.local [root@k8s99-101 ~]# cat /etc/rc.d/rc.local | grep resolv # 最后添加一行 sed -i '2a search host.com' /etc/resolv.conf # 因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 [root@k8s99-101 ~]# chmod +x /etc/rc.d/rc.local ``` 这样每次系统启动时就会执行这一条语句。 其他主机也需要做此操作 ```bash [root@k8s99-102 ~]# echo "sed -i '2a search host.com' /etc/resolv.conf" >> /etc/rc.d/rc.local && cat /etc/rc.d/rc.local | grep resolv && chmod +x /etc/rc.d/rc.local && reboot [root@k8s99-151 ~]# echo "sed -i '2a search host.com' /etc/resolv.conf" >> /etc/rc.d/rc.local && cat /etc/rc.d/rc.local | grep resolv && chmod +x /etc/rc.d/rc.local && reboot [root@k8s99-152 ~]# echo "sed -i '2a search host.com' /etc/resolv.conf" >> /etc/rc.d/rc.local && cat /etc/rc.d/rc.local | grep resolv && chmod +x /etc/rc.d/rc.local && reboot [root@k8s99-200 ~]# echo "sed -i '2a search host.com' /etc/resolv.conf" >> /etc/rc.d/rc.local && cat /etc/rc.d/rc.local | grep resolv && chmod +x /etc/rc.d/rc.local && reboot ```
很赞哦! (2)
相关文章
当前用户
未登录,点击 登录专题目录
- 【K8s+Docker技术全解】01.Kubernetes快速入门概述
- 【K8s+Docker技术全解】02.k8s搭建环境准备-准备DNS服务
- 【K8s+Docker技术全解】03.k8s搭建环境准备-证书签发环境和Docker环境
- 【K8s+Docker技术全解】04.运维主机部署Harbor环境
- 【K8s+Docker技术全解】05.部署k8s分布式数据库etcd
- 【K8s+Docker技术全解】06.Master主控节点服务-部署kube-apiserver集群
- 【K8s+Docker技术全解】07.Master主控节点服务-配置nginx4层反向代理
- 【K8s+Docker技术全解】08.Master主控节点服务-keepalived配置vip
- 【K8s+Docker技术全解】09.Master主控节点服务-部署controller-manager
- 【K8s+Docker技术全解】10.Master主控节点服务-部署kube-scheduler、检查集群状态
- 【K8s+Docker技术全解】11.Node运算节点服务-部署kubelet
- 【K8s+Docker技术全解】12.Node运算节点服务-部署kube-proxy
- 【K8s+Docker技术全解】13.验证kubernets集群
- 【K8s+Docker技术全解】14.关于k8s证书
- 【K8s+Docker技术全解】15.管理k8s核心资源方法
- 【kubernetes】使用kubeadm快速搭建k8s集群学习