一、环境准备
最小化安装操作系统:CentOS-7-x86_64-Minimal-2009.iso
# 新建虚拟机并配置固定IP及主机名,每个虚拟机8核数16G
it18101 172.18.5.131
it18102 172.18.5.199
it18103 172.18.5.74
it18104 172.18.5.252
设置主从时间同步,以172.18.5.131为主时间服务器,其它机器同步该服务器
# 安装时间同步【centos7默认已经安装】
yum -y install chrony
systemctl enable chronyd
systemctl start chronyd
systemctl restart chronyd
# 编辑时间同步
# NTP服务器:
# 210.72.145.44 (国家授时中心服务器IP地址))
# ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
vim /etc/chrony.conf # 主服务器配置
server 210.72.145.44 iburst
server ntp.sjtu.edu.cn iburst
# 主配置
# cat /etc/chrony.conf | grep -vE '^#|^$'
server 210.72.145.44 iburst
server ntp.sjtu.edu.cn iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 172.18.0.0/16
local stratum 10
logdir /var/log/chrony
# 从配置【都指向主服务器】
# cat /etc/chrony.conf | grep -vE '^#|^$'
server 172.18.5.131 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
# 查看时间同步状态
timedatectl status
# 开启网络时间同步
timedatectl set-ntp true
# 查看 ntp_servers
chronyc sources -v
# 查看 ntp_servers 状态
chronyc sourcestats -v
# 查看 ntp_servers 是否在线
chronyc activity -v
# 查看 ntp 详细信息
chronyc tracking -v
# 查看日期时间、时区及 NTP 状态
timedatectl
# 查看时区列表
timedatectl list-timezones
timedatectl list-timezones | grep -E "Asia/S.*"
# 修改时区
timedatectl set-timezone Asia/Shanghai
# 修改日期时间[一般不需要设置]
timedatectl set-time "2021-09-09 15:20:20"
# 开启 NTP
timedatectl set-ntp true/flase
# 开放端口【每台都开放】
firewall-cmd --add-service=ntp --permanent
firewall-cmd --reload
# 因NTP使用123/UDP端口协议,所以允许NTP服务即可
设置selinux为警告
vim /etc/selinux/config
grep -Ev '^$|^#' /etc/selinux/config
# 配置为警告即可
SELINUX=permissive
SELINUXTYPE=targeted
# 重启生效
reboot
开放rancher所需防火墙端口
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=2376/tcp
firewall-cmd --permanent --add-port=2379/tcp
firewall-cmd --permanent --add-port=2380/tcp
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=9099/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10254/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=30000-32767/udp
firewall-cmd --reload
通常情况下,可以将这些端口在 Kubernetes 节点上开放,无论它是哪种类型的集群。
协议 | 端口 | 描述 |
---|---|---|
TCP | 22 | 使用主机驱动通过 SSH 进行节点配置 |
TCP | 2376 | 主机驱动与 Docker 守护进程通信的 TLS 端口 |
TCP | 2379 | etcd 客户端请求 |
TCP | 2380 | etcd 节点通信 |
UDP | 8472 | Canal/Flannel VXLAN overlay 网络 |
UDP | 4789 | Windows 集群中 Flannel VXLAN overlay 网络 |
TCP | 9099 | Canal/Flannel 健康检查 |
TCP | 9796 | 集群监控拉取节点指标的默认端口(仅需要内网可达) |
TCP | 6783 | Weave 端口 |
UDP | 6783-6784 | Weave UDP 端口 |
TCP | 10250 | Metrics server 与所有节点的通信 |
TCP | 10254 | Ingress controller 健康检查 |
TCP/UDP | 30000-32767 | NodePort 端口范围 |
安装docker[要高于Docker 19.03版本]
curl -fsSL https://get.docker.com/ | sh
# docker -v
Docker version 20.10.8, build 3967b7d
修改国内镜像,提升速度
国内Docker镜像仓库名称 | 链接 |
---|---|
Docker 官方中国区 | https://registry.docker-cn.com |
网易 | http://hub-mirror.c.163.com |
中国科学技术大学 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https://<你的ID>.mirror.aliyuncs.com |
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"]
}
# 推荐使用
echo '{"registry-mirrors": ["https://registry.docker-cn.com"]}'> /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
docker search nginx
二、简单安装
第一步:创建挂在目录
mkdir -p /opt/rancher/{certs,data,logs}
第二步:解决证书问题
使用已有的可信证书方式,并且docker方式安装。
提前在Let's Encrypt 申请*.domain.com
泛域名证书,省去单个证书配置麻烦。
一旦启用外部证书,则确保内部访问用证书保函的域名访问。
# 制作好证书上传到指定目录,注意证书必须是pem格式
# tree /opt/rancher
/opt/rancher
├── certs
│ ├── full_chain.crt
│ └── private_key.key
├── data
└── logs
挂在已有外部证书,先记录暂不执行,后面还需挂在其它目录,制作完再执行。
docker run -d --privileged --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /opt/rancher/certs/full_chain.crt:/etc/rancher/ssl/cert.pem \
-v /opt/rancher/certs/private_key.key:/etc/rancher/ssl/key.pem \
rancher/rancher:stable \
--no-cacerts
第三步:挂载审计日志
API 审计日志记录通过 Rancher Server 进行的所有用户请求和系统事务。
--restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /opt/rancher/logs:/var/log/auditlog \
-e AUDIT_LEVEL=1 \
rancher/rancher:stable
第四步:持久化数据
--restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /opt/rancher/data:/var/lib/rancher \
rancher/rancher:stable
【最终安装】综合执行:
# 宿主操作:echo "Asia/Shanghai" > /etc/timezone
#-v /etc/timezone:/etc/timezone:ro \
#-v /etc/localtime:/etc/localtime:ro \
# 执行挂载运行
docker run -d --privileged --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /opt/rancher/certs/full_chain.crt:/etc/rancher/ssl/cert.pem \
-v /opt/rancher/certs/private_key.key:/etc/rancher/ssl/key.pem \
-v /opt/rancher/logs:/var/log/auditlog \
-e AUDIT_LEVEL=1 \
-v /opt/rancher/data:/var/lib/rancher \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
rancher/rancher:stable \
--no-cacerts
# 重装快捷卸载
# 停止所有
docker ps | awk '{print $1}' | xargs docker stop
# 删除所有
docker ps -a | awk '{print $1}' | xargs docker rm -f
配置域名测试:
Windows路径:C:\Windows\System32\drivers\etc\hosts
# 简单测试,本次直接使用hosts指向,后期改DNS映射即可
172.18.5.131 rancher.domain.com
访问:rancher.domain.com 即可。
使用代理访问,并且不配置证书:
内部使用私有证书,仅外网配置证书
docker run -d --privileged --restart=unless-stopped \
-p 8080:80 -p 8443:443 \
-v /opt/rancher/logs:/var/log/auditlog \
-e AUDIT_LEVEL=1 \
-v /opt/rancher/data:/var/lib/rancher \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
rancher/rancher:stable
# 找回密码
docker exec -ti <container_id> reset-password
docker exec -ti c445c3a1c6aa reset-password
由于这个时候,没有做代理开放端口,因此需要借助nginx或防火墙转发
这里使用nginx方式:
第一种方式:直接宿主机安装nginx方式
upstream rancher {
# docker IP:port
server 172.17.0.2:443;
# 或者 server 172.17.0.2:80
}
server {
listen 443 ssl;
server_name rancher.domain.com;
ssl_certificate certs/full_chain.crt;
ssl_certificate_key certs/private_key.key;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://rancher;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 900s;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name rancher.domain.com;
return 301 https://$server_name$request_uri;
}
第二种方式:使用docker 安装nginx
# 拉取镜像
docker pull nginx:latest
# 注意: rancher/rancher 指定名称启动 --name=rancher-server
mkdir -p /opt/nginx/{certs,conf,conf.d,html,logs}
# tree nginx/
nginx/
├── certs
│ ├── full_chain.crt
│ └── private_key.key
├── conf
│ └── nginx.conf
├── conf.d
│ ├── default.conf
│ └── rancher.conf
├── html
│ ├── 50x.html
│ └── index.html
└── logs
├── access.log
└── error.log
5 directories, 9 files
# 以上文件如何获得
# 1.不挂载任何目录 直接docker启动nginx
# 2.拷贝docker中nginx到本地目录 [docker cp 容器id:/具体目录或文件 ./]
# 3.certs 直接把本地目录挂载上去即可
# 4.注意certs和conf.d为直接目录映射,但要提前准备一一对应的文件。
# 5. 保持时间一致
# 宿主操作:echo "Asia/Shanghai" > /etc/timezone
#-v /etc/timezone:/etc/timezone:ro \
#-v /etc/localtime:/etc/localtime:ro \
# 挂载启动nginx
docker run -d --restart=always --name=nginx-proxy \
-p 80:80 -p 443:443 \
-v /opt/nginx/certs:/etc/nginx/certs \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/logs:/var/log/nginx \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
--link=rancher-server \
nginx:latest
# 常用操作
# 外部执命令
docker exec -t 8ed6c4fc16b4 /bin/bash -c 'cd /etc/nginx && pwd;ls conf.d'
# 测试配置
docker exec -t 8ed6c4fc16b4 /bin/bash -c 'nginx -t'
# 重新加载文件
docker exec -t 8ed6c4fc16b4 /bin/bash -c 'nginx -s reload'
查看状态
# 监视状态
docker inspect 1c81eaa0f79a
# 查看IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' 1c81eaa0f79a
# 查看运行状态
docker inspect --format '{{.Name}} {{.State.Running}}' 1c81eaa0f79a
# 查看代理端口
netstat -nlp |grep docker-proxy|awk '{print $4}'|sort
# 查看ip
arp -a |grep docker
# 查看端口【宿主机查看即可】
ps -ef | grep "http-listen-port"
# 也可以进入容器,再查看
docker exec -it 1c81eaa0f79a /bin/bash
ps -ef | grep "http-listen-port"
# 显示并查看 Rancher 服务器的日志
docker logs -f 1c81eaa0f79a
关于解决docker时区问题,时区不对会导致业务紊乱,保证时间一致非常关键。
# 解决docker时区问题
echo "Asia/Shanghai" > /etc/timezone
-v /etc/timezone:/etc/timezone:ro
-v /etc/localtime:/etc/localtime:ro
# 方式一
# 运行时直接挂载:【推荐挂载方式】
docker run -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro
# Docker-compose 构建,在docker-compose.yml文件相应应用下添加卷:
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
# “ro”的意思是只读(read-only)模式,可以保证其挂载卷不被 Docker 容器内部文件系统配置所覆盖。
# 方式二
# 复制宿主机 localtime 配置
docker cp /etc/timezone 容器ID:/etc/timezone
docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID:/etc/localtime
docker restart 容器ID
# 检测时间是否一致
[root@it18101 ~]# docker exec -t 8ed6c4fc16b4 /bin/bash -c 'date'
Fri Sep 10 10:31:18 CST 2021
[root@it18101 ~]# date
Fri Sep 10 10:32:37 CST 2021
[root@it18101 ~]#
# 其它时间调整
# Java 应用,在启动 jar 包时添加环境变量
-Duser.timezone=GMT+08
# MySQL 容器时区,run 时添加参数
-e TZ="Asia/Shanghai"
附:关于目录挂载
# 单目录挂载
docker run -it -v /宿主机目录:/容器目录 镜像名
# 多目录挂载
# 没有执行权限,则添加 --privileged=true 来解决挂载的目录没有权限的问题。
docker run -it -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
# 只读目录挂载
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 已运行追加挂载
# 美化json输出 | python -m json.tool
find / -name config.v2.json
cat /var/lib/docker/containers/container-ID/config.v2.json | python -m json.tool
# 修改配置文件(需停止docker服务)
# 命令模式: :%!python -m json.tool 美化JSON
vim /var/lib/docker/containers/container-ID/config.v2.json
# 1、停止docker服务
# 修改之前必须停止docker服务
systemctl stop docker.service
# Warning: Stopping docker.service, but it can still be activated by:
# docker.socket
# systemctl stop docker.socket
# 2、vim /var/lib/docker/containers/container-ID/config.v2.json
# 修改配置文件中的目录位置,然后保存退出
{
"MountPoints": {
"/etc/nginx/certs": {
"Destination": "/etc/nginx/certs",
"Driver": "",
"Name": "",
"Propagation": "rprivate",
"RW": true,
"SkipMountpointCreation": false,
"Source": "/opt/nginx/certs",
"Spec": {
"Source": "/opt/nginx/certs",
"Target": "/etc/nginx/certs",
"Type": "bind"
},
"Type": "bind"
}
}
# 3、启动docker服务
systemctl start docker.service
# 4、启动docker容器
docker start <container-name/ID>
-
在Rancher上疏散该节点
-
删除节点
-
登录该节点宿主机,删除rancher相关容器
docker rm -f -v $(docker ps -aq)
-
删除该节点的所有volume
docker volume rm $(docker volume ls)
-
最后删除/var/lib/rancher文件夹
-
节点删除成功!
7.打包及导入
# 打包
docker save $(docker images | grep rancher | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o k8s-node.tar
# 导入
docker load -i k8s-master.tar
网友评论