Kubernetes多master节点部署反向代理服务器
如图所示,在之前的多master节点的基础上搭建一个由nginx做反向代理和负载均衡的调度器。nginx的虚拟IP为:192.168.80130/24.两个proxy代理节点IP地址为:192.168.80.136/24和192.168.80.137/24.
搭建nginx服务
这里的nginx我是用的手动编译安装nginx,所以nginx这里不再过多的赘述如何安装nginx。
搭建keepalived服务
这里我是用yum安装的方法在两个proxy节点安装keepalived。
yum install keepalived -y
修改keepalived的配置文件
! Configuration File for keepalived
#keepalived的全局配置
global_defs {
#邮件模块,报警邮件地址
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
#报警的邮箱服务器
smtp_server 127.0.0.1
smtp_connect_timeout 30
#同一局域网内的统一标识
router_id_01
vrrp_skip_check_adv_addr
###################################
#这里需要注释,如果不加注释是无法ping通VIP
# vrrp_strict
###################################
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#检测 nginx 状态的脚本路径
vrrp_script chk_nginx {
script "/opt/chk_nginx.sh"
## 检测时间间隔
interval 2
## 如果条件成立,权重-20
weight -20
}
#定义实例,定义主备节点、端口
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 10
priority 100
# 主备心跳通讯时间间隔,组播信息发送间隔,两个节点设置必须一样, 默认 1s
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
## 执行 Nginx 监控的服务
track_script {
chk_nginx
}
#配置的虚拟IP地址
virtual_ipaddress {
192.168.80.130/24
}
}
另一个proxy节点上只需要修改其中一部分内容。
#状态改为备用
state BACKUP
#修改优先级
priority 99
keepalived的配置文件中定义了监控nginx的脚本,需要在相应的目录下编写监控nginx的脚本。大致的意思是:如果查不到nginx的进程号那么解停止keepalived服务,VIP漂移到其他节点。
vim /opt/chk_nginx.sh
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
/etc/init.d/keepalived stop
fi
在启动keepalived之前需要先开启nginx服务。之后再做VIP地址漂移测试。
#开启nginx
systemctl start nginx
#开启keepalived
systemctl start keepalived
VIP生效之后,停止proxy01节点的nginx服务查看VIP是否漂移到proxy02节点。
下面开始配置nginx的配置文件,需要注意的是如果在编译安装nginx的时候没有安装stream模块,需要再次添加stream模块编译安装一次。
worker_processes 1;
events {
worker_connections 1024;
}
################## 添加如下内容 ########################################
stream {
#定义日志的格式和日志文件的路径
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
#master01的IP地址和master02的IP地址
upstream k8s-apiserver {
server 192.168.80.132:6443;
server 192.168.80.133:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
#####################################################################
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#由于日志文件路径不存在需要手动创建
mkdir -p /var/log/nginx
重启nginx服务,并且访问VIP,可以浏览网页。
代理端其实已经完成了,这时就需要修改node节点中的配置文件,将apiserver的地址改为代理端的VIP。
#移动到/opt/kubernetes/cfg
cd /opt/kubernetes/cfg
vim bootstrap.kubeconfig
vim kubelet.kubeconfig
vim kube-proxy.kubeconfig
将这三个配置文件中的serverip改为代理的VIP。
server: https://192.168.80.130:6443
查看是否都改为VIP地址。
grep 130 *
接着重启kubelet、buke-proxy
systemctl restart kubelet.service
systemctl restart kube-proxy.service
查看proxy代理端的日志文件,是否有node节点的请求到master节点。这里的日志文件格式是参照nginx配置文件所定义的日志文件格式。 log_format main ‘$remote_addr u p s t r e a m a d d r − [ upstream_addr - [ upstreamaddr−[time_local] $status $upstream_bytes_sent’;来访IP地址-跳转上游服务器IP地址-日期状态码
[root@proxy_01 nginx]# tail k8s-access.log
192.168.80.134 192.168.80.133:6443 - [02/May/2020:12:12:16 +0800] 200 1121
192.168.80.135 192.168.80.132:6443 - [02/May/2020:12:12:16 +0800] 200 1119
192.168.80.135 192.168.80.132:6443 - [02/May/2020:12:12:16 +0800] 200 1120
192.168.80.135 192.168.80.133:6443 - [02/May/2020:12:12:16 +0800] 200 1120
192.168.80.135 192.168.80.132:6443 - [02/May/2020:12:12:17 +0800] 200 1566
192.168.80.134 192.168.80.133:6443 - [02/May/2020:12:12:26 +0800] 200 1566
到这步其实已经完成了代理的搭建,我们可以创建一个nginx的pod。
kubectl run nginx --image=nginx
之后我们用命令查看pod的状态
[root@master_01 cfg]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-dbddb74b8-wl7qx 1/1 Running 0 10m
详细的pod信息我们用可以查看到具体的IP地址:
[root@master_01 cfg]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-dbddb74b8-wl7qx 1/1 Running 0 27m 172.17.59.2 192.168.80.134 <none>
这时我们在node节点访问pod的IP地址:172.17.59.2
在node节点中打开浏览器,输入pod的IP地址。
我们也可以用curl命令:
要想查看pod中的nginx的日志文件需要创建一个匿名用户的,可以有权限查看pod内部的日志。
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
clusterrolebinding.rbac.authorization.k8s.io/cluster-system-anonymous created
创建用户需要在etcd中添加的所以在任意master节点中添加都没有关系。最后查看日志。
这样Kubernetes的代理就搭建完毕了。