使用confd与nginx 实现kubernetes master节点高可用

下载confd 二进制文件

# 创建目录方便存放文件
mkdir confd
# 进入新创建的目录
cd confd
# 下载 confd
wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
# 重命名
mv confd-0.16.0-linux-amd64  confd
# 给confd 可执行权限
chmod +x confd

生成confd 配置

# 创建confd 配置目录
mkdir -p ./conf.d
# 创建模版存放目录
mkdir -p ./templates
# 生成confd 配置文件
cat << EOF | tee ./conf.d/nginx.toml
[template]
src = "nginx.tmpl"
dest = "/etc/nginx/nginx.conf"
keys = [
    "CP_HOSTS",
]
EOF
# 生成模版文件
cat << EOF | tee ./templates/nginx.tmpl
error_log stderr notice;

worker_processes auto;
events {
  multi_accept on;
  use epoll;
  worker_connections 4096;
}

stream {
        upstream kube_apiserver {
            {{ \$servers := split (getenv "CP_HOSTS") "," }}{{range \$servers}}
            server {{.}}:6443;
            {{end}}
        }

        server {
            listen        6443;
            proxy_pass    kube_apiserver;
            proxy_timeout 30;
            proxy_connect_timeout 2s;

        }

}
EOF
# 生成启动文件
cat << EOF | tee ./nginx-proxy
#!/bin/sh

# Run confd
confd -onetime -backend env

# Start nginx
nginx -g ‘daemon off;‘
EOF
# 给启动文件执行权限
chmod +x ./nginx-proxy

Dockerfile

vim  Dockerfile
# 基础镜像
FROM alpine

# 作者信息
MAINTAINER nginx 1.17.9 Docker Maintainers "[email protected]"

# 修改源
RUN sed -i ‘s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g‘ /etc/apk/repositories

# 安装ca 证书
RUN apk update &&     apk add --no-cache ca-certificates 

# 设置环境变量

ENV NGINX_VERSION 1.17.9

ENV OPENSSL_VERSION 1.1.1e

# 编译安装NGINX

WORKDIR /tmp

RUN NGINX_CONFIG="      --prefix=/etc/nginx       --sbin-path=/usr/sbin/nginx       --conf-path=/etc/nginx/nginx.conf       --error-log-path=/var/log/nginx/error.log       --http-log-path=/var/log/nginx/access.log       --pid-path=/var/run/nginx.pid       --lock-path=/var/run/nginx.lock       --http-client-body-temp-path=/var/cache/nginx/client_temp       --http-proxy-temp-path=/var/cache/nginx/proxy_temp       --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp       --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp       --http-scgi-temp-path=/var/cache/nginx/scgi_temp       --with-pcre       --user=nginx       --group=nginx       --with-compat       --with-file-aio       --with-threads       --with-http_addition_module       --with-http_auth_request_module       --with-http_dav_module       --with-http_flv_module       --with-http_gunzip_module       --with-http_gzip_static_module       --with-http_mp4_module       --with-http_random_index_module       --with-http_realip_module       --with-http_secure_link_module       --with-http_slice_module       --with-http_ssl_module       --with-http_stub_status_module       --with-http_sub_module       --with-http_v2_module       --with-ipv6       --with-openssl=../openssl-$OPENSSL_VERSION       --with-openssl-opt=enable-tls1_3       --with-mail       --with-mail_ssl_module       --with-stream       --with-stream_realip_module       --with-stream_ssl_module       --with-stream_ssl_preread_module       --with-ld-opt=-Wl,--as-needed      "      && addgroup -S nginx      && adduser -D -S -h /www -s /sbin/nologin -G nginx nginx      && apk  add  --no-cache --virtual .build-deps         gcc         libc-dev         make         pcre-dev         zlib-dev         linux-headers         curl         gnupg         libxslt-dev         gd-dev         geoip-dev         libstdc++ wget         libjpeg          libpng         libpng-dev         freetype         freetype-dev         libxml2         libxml2-dev         curl-dev         libmcrypt         libmcrypt-dev         autoconf         libjpeg-turbo-dev         libmemcached         libmemcached-dev         gettext         gettext-dev         libzip         git         libzip-dev         && curl -fSL  https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz -o /tmp/openssl-$OPENSSL_VERSION.tar.gz         && curl -fSL https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o /tmp/nginx-$NGINX_VERSION.tar.gz         && cd /tmp         && tar -xzf openssl-$OPENSSL_VERSION.tar.gz         && tar -xzf nginx-$NGINX_VERSION.tar.gz         && cd  /tmp/nginx-$NGINX_VERSION         && ./configure $NGINX_CONFIG         && make -j$(getconf _NPROCESSORS_ONLN)         && make install

# 构建confd nginx 镜像

FROM alpine
# 作者信息
MAINTAINER nginx 1.17.9 Docker Maintainers "[email protected]"

# 修改源
RUN sed -i ‘s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g‘ /etc/apk/repositories

# 安装ca 证书
RUN apk update &&     apk add --no-cache ca-certificates 

# 设置环境变量

ENV NGINX_VERSION 1.17.9

ENV OPENSSL_VERSION 1.1.1e

RUN  mkdir -p /var/lib/nginx/cache      && apk add  --no-cache  \
           curl            wget            pcre           && addgroup -S nginx           && adduser -D -S -h /var/lib/nginx -s /sbin/nologin -G nginx nginx         && chown -R nginx:nginx /var/lib/nginx         && mkdir -p /var/log/nginx         && rm -rf /var/cache/apk/*         && mkdir -p /etc/confd         && mkdir -p /var/cache/nginx/client_temp
#COPY 编译结果  

COPY --from=0  /usr/sbin/nginx /usr/sbin/nginx
COPY --from=0  /etc/nginx  /etc/nginx
ADD confd  /usr/sbin/confd
ADD conf.d /etc/confd/conf.d
ADD templates /etc/confd/templates
ADD nginx-proxy /usr/bin/nginx-proxy

STOPSIGNAL SIGTERM

ENTRYPOINT ["/usr/bin/nginx-proxy"]

生成镜像

[[email protected] confd]# tree
.
|-- Dockerfile
|-- conf.d
|   `-- nginx.toml
|-- confd
|-- nginx-proxy
`-- templates
    `-- nginx.tmpl

2 directories, 5 files
# 生成镜像
docker build -t ha-tools:v1.17.9 .     # 镜像名字自己修改 我这里以ng 版本为tag
# 给进行打新tag
docker tag ha-tools:v1.17.9  juestnow/ha-tools:v1.17.9
# 上传镜像
docker push  juestnow/ha-tools:v1.17.9

测试生成的镜像

# 单个IP
docker run -tid --network=host --name=ha-proxy -e "CP_HOSTS=192.168.2.175" juestnow/ha-tools:v1.17.9s CP_HOSTS=192.168.2.175
# 多个IP
docker run -tid --network=host --name=ha-proxy -e "CP_HOSTS=192.168.2.175,192.168.2.176,192.168.2.177" juestnow/ha-tools:v1.17.9 CP_HOSTS=192.168.2.175,192.168.2.176,192.168.2.177
# 进去容器查看是否正常
docker ps
docker exec -ti 27733e5f9a97 /bin/sh
/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 {nginx-proxy} /bin/sh /usr/bin/nginx-proxy CP_HOSTS=192.168.2.175,192.168.2.176,192.168.2.177
   12 root      0:00 nginx: master process nginx -g daemon off;
   13 nginx     0:00 nginx: worker process
   14 nginx     0:00 nginx: worker process
   15 nginx     0:00 nginx: worker process
   16 nginx     0:00 nginx: worker process
   17 root      0:00 /bin/sh
   22 root      0:00 ps -ef
     # 查看端口监听
     / # netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:6443            0.0.0.0:*               LISTEN      12/nginx: master pr
# 验证访问
/ # curl -k https://127.0.0.1:6443
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "Unauthorized",
  "reason": "Unauthorized",
  "code": 401
}/ #
代理正常有数据返回

k8s 使用 ha-tools

# kube-apiserver 节点不部署 ha-tools 只是node 节点部署
# 二进制部署kube-apiserver 证书签名时加上127.0.0.1 这个IP 以后整个集群访问都走127.0.0.1 这个IP+端口 同时kube-apiserver 改成0.0.0.0如果不修改master 安装kubelet 的时候记得修改IP
# kubeadm 安装时 请加入apiserver-cert-extra-sans=127.0.0.1 这样才能127.0.0.1 访问不然会一致报错
# 每个node 节点运行
docker run -tid --network=host --name=ha-proxy -e "CP_HOSTS=192.168.2.175,192.168.2.176,192.168.2.177" juestnow/ha-tools:v1.17.9 CP_HOSTS=192.168.2.175,192.168.2.176,192.168.2.177
# 还可以放到kubelet manifests 目录
[[email protected] manifests]# cat ha-tools.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: ha-tools
    tier: control-plane
  name: ha-tools
  namespace: kube-system
spec:
  containers:
  - args:
    - "CP_HOSTS=192.168.2.175,192.168.2.176,192.168.2.177"
    image: juestnow/ha-tools:v1.17.9
    imagePullPolicy: IfNotPresent
    name: ha-tools
    env:
    - name: CP_HOSTS
      value: "192.168.2.175,192.168.2.176,192.168.2.177"
  hostNetwork: true
  priorityClassName: system-cluster-critical
status: {}
# 二进制方式部署推荐使用以上的方式
[[email protected] ~]# kubectl get pod -A | grep ha-tools
kube-system   ha-tools-nginx-1                                1/1     Running   0          14h


# kubeadm 方式部署高可用修改kube-proxy 让它连接127.0.0.1
kubectl -n kube-system edit configmaps kube-proxy
# 二进制部署直接在 kubeconfig 添加就可以

原文地址:https://blog.51cto.com/juestnow/2479933

时间: 2024-07-31 08:47:59

使用confd与nginx 实现kubernetes master节点高可用的相关文章

mysql-master-ha 实现mysql master的高可用。

好久没有写技术博客了, 这几天重新把<高可用mysql> 这本书捡起来看一遍,里面提到了用https://launchpad.net/mysql-replicant-python 来提供自动主备复制 , 由此想到了之前看中国数据库技术大会中提到的mysql-master-ha来提供master的高可用方案,在测试集群上做了一下测试. 测试环境: OS: centos 6.5 mysql: 5.6.27-log mysql-master-ha: 0.56 和https://code.google

用Kolla在阿里云部署10节点高可用OpenStack

为展现 Kolla 的真正实力,我在阿里云使用 Ansible 自动创建 10 台虚机,部署一套多节点高可用 OpenStack 集群! 前言 上次 Kolla 已经表示了要打 10 个的愿望,这次我们就满足它. 通过本期内容,你将看到: 如何使用阿里云云命令行(Cloud Shell) 如何使用 Ansible 创建阿里云资源 Kolla 多节点部署配置说明 OpenStack 高可用架构 本期内容仍然是干货满满,写文章,调脚本,剪视频,不但花时间,还要在 阿里云 花钱租云服务器,真的费了不少

openstack 扩展开发最佳实践之计算节点高可用

前言:注意是扩展开发,这个词是我杜撰的,大概意思是指基于openstack的rest api做的一些开发,用于辅助相关功能,而不是直接改动openstack内的代码,怎么修改添加openstack各个组件的代码不在此文章内容内. 首先,千万,千万,千万不要用Openstack提供的SDK,原因如下. 一,SDK的相关文档并不健全. 二,版本不够统一,即兼容的问题. 所以不要使用openstack的SDK而是自己查阅openstack的API文档,通过requests库发http请求要比SDK灵活

Nginx+Zuul集群实现高可用网关

代码参考:https://github.com/HCJ-shadow/Zuul-Gateway-Cluster-Nginx Zuul的路由转发功能 前期准备 搭建Eureka服务注册中心 服务提供者msc-provider-5001[提供一个hello请求做测试] 创建gateway-7001 pom依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-

[经验交流] Active-Active 方式设置 kubernetes master 多节点高可用

关于 kubernetes master 多节点以及高可用,网上的方法多采取 Active-Standby 方式,即: 通过 pacemaker 等软件使得某种 master 服务(apiserver,scheduler,controller-manager)同一时间只运行一个实例.具体来说,如果有多台master node,上面都安装了scheduler,controller-manager, apiserver: 对于schduler服务,同一时间只在一台master 节点上运行, 对于co

Kubernetes master节点的高可用配置

了解Kubernetes架构都知道Master节点在整个集群中的位置,为了保证整个架构的高可用,Kubernetes提供了HA的架构,处于兴趣和对架构的进一步了解,我在自己的电脑实践以下. 环境: CentOS 7.3,Kubernetes版本 Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.1", GitCommit:"82450d03cb057b

Kubernetes Master节点灾备恢复操作指南---升级版

本文档简述了Kubernetes主节点灾备恢复的相关步骤,供在发生k8s master崩溃时操作. 就算是在k8s里部署了etcd群集, 主节点控制组件的高可用节点,灾备恢复也是必须要实现的操作,才能形成完备的企业级服务方案. K8s集群在master节点发生故障时,并不会影响已有的pod运行和服务开放,所以对服务是没有影响的.故而我们可以在发生故障之后,挑选合适的时间窗口进行维护和恢复,可以对外部客户造成最低的影响. 严格来讲,通过kubeadm安装的k8s主节点包括两大类的灾备恢复,etcd

Kubernetes Ingress-Nginx实现高可用

假定我们在Kubernetes 指定两个worker节点中部署了ingress nginx来为后端的pod做proxy,这时候我们就需要通过keepalived实现高可用,提供对外的VIP 首先我们要先确保有两个worker节点部署了ingress nginx在本实验中,环境如下: IP地址 主机名 描述 10.0.0.31 k8s-master01 10.0.0.34 k8s-node02 ingress nginx.keepalived 10.0.0.35 k8s-node03 ingres

keepalived+nginx 双主模型实现高可用服务

一.keepalived的工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗协议. 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个虚拟路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为mas