基于docker部署高可用Kubernetes1.25.2(上)

简介: 基于docker部署高可用Kubernetes1.25.2

前言

  • 本次使用kubeadm部署
  • 使用docker
  • nginx反向代理apiserver实现管理面高可用
  • Ubuntu 20.04系统
  • 使用外部etcd集群

一、环境准备

本次部署准备了8台Ubuntu虚拟机,分为3个master节点、3个work节点、1个负载均衡节点、1个harbor节点*(正常其实可以多上一个负载均衡节点通过keepalived做高可用,但是我这次用的云主机没法使用keepalived)*

具体的准备工作可以看这一篇,为了方便免密,这里也准备一个脚本

root@master1:~# cat ssh-ssh.sh 
#!/bin/bash
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
for host in  `awk '{print $1}' /etc/hosts`
do
    expect -c "
    spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@${host}
        expect {
                *yes/no* {send -- "yes\r"; exp_continue}
                *assword* {send zettakit\r; exp_continue}
               }"
done
root@master1:~# sh ssh-ssh.sh

二、安装etcd集群

本次etcd复用的3个master节点

root@master1:~# cat  /etc/hosts 
10.10.21.170  master1
10.10.21.172  master2
10.10.21.175  master3
10.10.21.171  node1
10.10.21.173  node2
10.10.21.176  node3
10.10.21.178  kubeapi
10.10.21.174  harbor
EOF

下载etcd安装包

root@master1:~# wget https://github.com/etcd-io/etcd/releases/download/v3.3.5/etcd-v3.3.5-linux-amd64.tar.gz
root@master1:~#  mkdir -p /etc/etcd/pki 
root@master1:~# tar -xf etcd-v3.3.5-linux-amd64.tar.gz  &&  mv etcd-v3.3.5-linux-amd64 /etc/etcd/

使用cfssl工具在/etc/etcd/pki 目录创建私有证书

具体过程参考harbor博客的证书部分

root@master1:~ # cd /etc/etcd/pki
root@master1:/etc/etcd/pki # cat > etcd-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "10.10.21.170",
    "10.10.21.172",
    "10.10.21.175"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "HuBei",
      "L": "WuHan",
      "O": "etcd",
      "OU": "org"
    }
  ]
}
EOF
root@master1:/etc/etcd/pki # cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd.json | cfssljson -bare peer    #生成需要的证书文件
  • hosts需要将所有etcd节点地址都写上

编辑etcd的service文件,为了避免出问题,我把一些易错的地方写了注释,实际部署的时候需要把注释删除

root@master1:~# cat /lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/etc/etcd/etcd-v3.3.5-linux-amd64/etcd \   #目录对应etcd二进制文件的目录
  --name=master1 \              # 需要和本节点名对应,否则会报错
  --cert-file=/etc/etcd/pki/server.pem \  # 证书文件和目录对应路径,写错了起不来
  --key-file=/etc/etcd/pki/server-key.pem \
  --peer-cert-file=/etc/etcd/pki/peer.pem \
  --peer-key-file=/etc/etcd/pki/peer-key.pem \
  --trusted-ca-file=/etc/etcd/pki/ca.pem \
  --peer-trusted-ca-file=/etc/etcd/pki/ca.pem \
  --initial-advertise-peer-urls=https://10.10.21.170:2380 \  #本节点IP地址
  --listen-peer-urls=https://10.10.21.170:2380 \      #本节点IP地址
  --listen-client-urls=https://10.10.21.170:2379 \      #本节点IP地址
  --advertise-client-urls=https://10.10.21.170:2379 \   #本节点IP地址
  --initial-cluster-token=etcd-cluster-0 \          #集群名字自定义
  --initial-cluster=master1=https://10.10.21.170:2380,master2=https://10.10.21.172:2380,master3=https://10.10.21.175:2380 \         #依然是节点名字和IP对应
  --initial-cluster-state=new \
  --data-dir=/data/etcd \
  --snapshot-count=50000 \
  --auto-compaction-retention=1 \
  --max-request-bytes=10485760 \
  --quota-backend-bytes=8589934592
Restart=always
RestartSec=15
LimitNOFILE=65536
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target

将文件传输到其他节点

root@master1:~# for i in master2 master3;do scp -r /etc/etcd $i:/etc/ ;scp /lib/systemd/system/etcd.service $i:/lib/systemd/system/etcd.service ;done

按要求修改完配置文件之后启动etcd

root@master1:~# for i in master2 master3;do ssh $i systemctl daemon-reload ;ssh $i systemctl enable --now etcd ;done

查询etcd集群状态信息

root@master1:~#  export NODE_IPS="10.10.21.170 10.10.21.172 10.10.21.175"
root@master1:~# for ip in ${NODE_IPS};do ETCDCTL_API=3 /etc/etcd/etcd-v3.3.5-linux-amd64/etcdctl --write-out=table endpoint status --endpoints=https://${ip}:2379 --cacert=/etc/etcd/pki/ca.pem --cert=/etc/etcd/pki/server.pem --key=/etc/etcd/pki/server-key.pem;done
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
|         ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://10.10.21.170:2379 | 3f5dcb4f9728903b |   3.3.5 |  3.0 MB |     false |        32 |    1239646 |
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
|         ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://10.10.21.172:2379 | 13dde2c0d8695730 |   3.3.5 |  3.0 MB |      true |        32 |    1239646 |
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
|         ENDPOINT          |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://10.10.21.175:2379 | 6acd32f3e7cb1ab7 |   3.3.5 |  3.0 MB |     false |        32 |    1239646 |
+---------------------------+------------------+---------+---------+-----------+-----------+------------+
root@master1:/opt# ETCDCTL_API=3  /etc/etcd/etcd-v3.3.5-linux-amd64/etcdctl --cacert=/etc/etcd/pki/ca.pem --cert=/etc/etcd/pki/server.pem --key=/etc/etcd/pki/server-key.pem --endpoints="https://10.10.21.170:2379,https://10.10.21.172:2379,https://10.10.21.175:2379" endpoint health --write-out=table
https://10.10.21.172:2379 is healthy: successfully committed proposal: took = 577.956µs
https://10.10.21.175:2379 is healthy: successfully committed proposal: took = 1.122021ms
https://10.10.21.170:2379 is healthy: successfully committed proposal: took = 1.013689ms
# 这里etcdctl的命令路径、证书文件路径、etcd节点的地址需要确保别写错
root@master1:~# ETCDCTL_API=3 /etc/etcd/etcd-v3.3.5-linux-amd64/etcdctl --endpoints="10.10.21.170:2379,10.10.21.172:2379,10.10.21.175:2379" --cacert=/etc/etcd/pki/ca.pem --cert=/etc/etcd/pki/server.pem --key=/etc/etcd/pki/server-key.pem  endpoint status --write-out=table
+-------------------+------------------+---------+---------+-----------+-----------+------------+
|     ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+-------------------+------------------+---------+---------+-----------+-----------+------------+
| 10.10.21.170:2379 | 3f5dcb4f9728903b |   3.3.5 |  7.5 MB |     false |       112 |    5704640 |
| 10.10.21.172:2379 | 13dde2c0d8695730 |   3.3.5 |  7.5 MB |     false |       112 |    5704640 |
| 10.10.21.175:2379 | 6acd32f3e7cb1ab7 |   3.3.5 |  7.5 MB |      true |       112 |    5704640 |
+-------------------+------------------+---------+---------+-----------+-----------+------------+

至此etcd部署完成

三、配置nginx四层代理

安装nginx并修改配置文件

root@lb:~# apt-get install nginx -y
root@lb:~# egrep -v "^#|^$" /etc/nginx/nginx.conf 
user www-data;
worker_processes 2;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
  worker_connections 768;
  # multi_accept on;
}
stream {
    upstream backend {
        hash \$remote_addr consistent;
        server 10.10.21.170:6443        max_fails=3 fail_timeout=30s;  #以下三行是代理apiserver的,配置连接失败3次之后熔断30秒
        server 10.10.21.172:6443        max_fails=3 fail_timeout=30s;
        server 10.10.21.175:6443        max_fails=3 fail_timeout=30s;
    }
    server {
        listen 6443;
        proxy_connect_timeout 1s;
        proxy_pass backend;
    }
    upstream dashboard {
        server 10.10.21.170:40000       max_fails=3 fail_timeout=30s;  #这里六行是我用来代理dashboard的,如不需要可以将这个upstream删除
        server 10.10.21.172:40000       max_fails=3 fail_timeout=30s;
        server 10.10.21.175:40000       max_fails=3 fail_timeout=30s;
        server 10.10.21.171:40000       max_fails=3 fail_timeout=30s;
        server 10.10.21.173:40000       max_fails=3 fail_timeout=30s;
        server 10.10.21.176:40000       max_fails=3 fail_timeout=30s;
    }
    server {
        listen 40000;
        proxy_connect_timeout 1s;
        proxy_pass dashboard;
    }
}
root@lb:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@lb:~# systemctl restart nginx    #验证语法无误之后重启nginx生效配置

额外补充Redhat系列

Centos直接使用yum安装nginx默认不带stream模块,如果需要使用相同的手法可以编译安装nginx

yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -r nginx -M -s /sbin/nologin
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz  && cd /nginx-1.16.1/
./configure  --prefix=/opt \  #指定nginx的安装路径
--user=nginx \          #指定用户名
--group=nginx \         #指定组名
--with-stream \         #安装stream模块
--without-http \
--without-http_uwsgi_module \ 
--with-http_stub_status_module  #启用 http_stub_status_module 模块以支持状态统计
make && make install

或者执行以下命令安装模块

yum -y install nginx
yum -y install nginx-all-modules

四、所有k8s节点安装docker并修改配置

#Ubuntu20.04可以利用内置仓库安装docker

root@master1:~# for i in master2 master3 node1 node2 node3;do ssh $i apt update;done
root@master1:~# for i in master2 master3 node1 node2 node3;do ssh $i apt -y install docker.io;done

如果安装不上也可以按阿里镜像源指导来安装

安装完成之后配置docker镜像仓库加速和cgroup驱动为systemd

root@master1:~# cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",     #这几个是国内的docker仓库地址,填一个即可
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"insecure-registries":["10.10.21.174:443"],    #这个是我的harbor仓库地址
"exec-opts": ["native.cgroupdriver=systemd"]   #配置cgroup driver
}
EOF
root@master1:~# for i in master2 master3 node1 node2 node3;do scp /etc/docker/daemon.json $i:/etc/docker/daemon.json ;done
root@master1:~# for i in master2 master3 node1 node2 node3;do ssh $i systemctl daemon-reload ;ssh $i systemctl restart docker; done
root@master1:~# for i in master2 master3 node1 node2 node3;do ssh $i docker info |grep Cgroup ;echo $i;done
root@master1:~# for i in master2 master3 node1 node2 node3;do ssh $i docker info |grep Cgroup ;echo $i;done
WARNING: No swap limit support      #提示没有swap限制,但是实际上swap已经关掉了,所以可以忽略
 Cgroup Driver: systemd
 Cgroup Version: 1
master2
WARNING: No swap limit support
 Cgroup Driver: systemd
 Cgroup Version: 1
master3
WARNING: No swap limit support
 Cgroup Driver: systemd
 Cgroup Version: 1
node1
 Cgroup Driver: systemd
 Cgroup Version: 1
WARNING: No swap limit support
node2
WARNING: No swap limit support
 Cgroup Driver: systemd
 Cgroup Version: 1
node3
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
1974 4
|
4月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
235 5
|
5月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
504 12
docker 部署 sftp
|
4月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
1403 7
|
4月前
|
存储 搜索推荐 数据库
🚀 RAGFlow Docker 部署全流程教程
RAGFlow是开源的下一代RAG系统,融合向量数据库与大模型,支持全文检索、插件化引擎切换,适用于企业知识库、智能客服等场景。支持Docker一键部署,提供轻量与完整版本,助力高效搭建私有化AI问答平台。
3375 8
|
4月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
788 4
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
1063 0
【云原生】阿里云服务器部署 Docker Swarm集群

热门文章

最新文章