1,准备工作。
1,主机准备。
本次部署所用机器均为CentOS Linux release 7.6.1810 (Core)
。
节点名称 | IP | 安装组件 |
---|---|---|
nginx | 172.18.17.169 | nginx用于四层负载均衡 |
server1 | 172.18.17.170 | Rancker-server-node |
server2 | 172.18.17.171 | Rancker-server-node |
server3 | 172.18.17.172 | Rancker-server-node |
worker1 | 172.18.17.180 | Rancker-agent-node |
worker2 | 172.18.17.181 | Rancker-agent-node |
worker3 | 172.18.17.182 | Rancker-agent-node |
4,推荐架构示意。
- Rancher的DNS 应解析到 4层(TCP) 负载均衡上。
- 负载均衡应将端口 TCP/80 和 TCP/443 转发到 Kubernetes 集群中的所有3个节点。
- Ingress-controller 将 HTTP 重定向到HTTPS并终止端口 TCP/443 上的 SSL/TLS(SSL数字证书在这里部署)。
- Ingress-controller 将流量转发到 pod 的 TCP/80 端口。
2,初始化环境。
初始化部分,三台node机器都要操作。
1,关闭相关服务
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭setlinx
$ sudo setenforce 0
$ grep SELINUX /etc/selinux/config
SELINUX=disabled
关闭swap
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2,主机名等设置。
- 设置永久主机名称,然后重新登录
$ sudo hostnamectl set-hostname ncd-sc-nginx #172.18.17.169
$ sudo hostnamectl set-hostname ncd-sc-rancher-server1 #172.18.17.170
$ sudo hostnamectl set-hostname ncd-sc-rancher-server2 #172.18.17.171
$ sudo hostnamectl set-hostname ncd-sc-rancher-server3 #172.18.17.172
$ sudo hostnamectl set-hostname ncd-sc-rancher-node1 #172.18.17.180
$ sudo hostnamectl set-hostname ncd-sc-rancher-node2 #172.18.17.181
$ sudo hostnamectl set-hostname ncd-sc-rancher-node3 #172.18.17.182
- 设置的主机名保存在 /etc/hosts 文件中(所有主机都改)
$ vi /etc/hosts
172.18.17.169 ncd-sc-nginx
172.18.17.170 ncd-sc-rancher-server1
172.18.17.171 ncd-sc-rancher-server2
172.18.17.172 ncd-sc-rancher-server3
172.18.17.180 ncd-sc-rancher-node1
172.18.17.181 ncd-sc-rancher-node2
172.18.17.182 ncd-sc-rancher-node3
3,操作系统及kernel调优
- 文件打开数调优。
echo -e "root soft nofile 65535\nroot hard nofile 65535\n* soft nofile 65535\n* hard nofile 65535\n" >> /etc/security/limits.conf
sed -i 's#4096#65535#g' /etc/security/limits.d/20-nproc.conf
- kernel调优
cat >> /etc/sysctl.conf<<EOF
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
vm.swappiness=0
vm.max_map_count=655360
EOF
4,安装一些基础软件。
yum -y install wget ntpdate lrzsz curl yum-utils device-mapper-persistent-data lvm2 bash-completion && ntpdate -u cn.pool.ntp.org
5,创建用户等
- 创建用户并且添加到docker组
groupadd docker
useradd rancher -G docker
echo "123456" | passwd --stdin rancher
这一步非常重要,如果没有操作,则后边可能会有报错等问题。
- ssh免密登录
在server1
服务器上执行下面命令:
su - rancher
ssh-keygen
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected] (三个node,可不需要此步)
ssh-copy-id [email protected] (三个node,可不需要此步)
ssh-copy-id [email protected] (三个node,可不需要此步)
#这中间会询问是否YES/NO=YES,再输入rancher用户的密码.进行server1连接其他机器
通过授权server1主机对三台主机的免密码登陆,为后边安装k8s的步骤做好准备工作。
3,安装docker。
需要在所有主机上一起安装docker(以root执行)。
- 1、RANCHER 官方SH方式安装:
curl https://releases.rancher.com/install-docker/18.09.sh | sh
- 2,卸载旧docker版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
container*
- 3、rancher安装Kubernetes支持的Dokcer版本: 推荐: 18.09.2 【20190910日版本-rancher V 2.2.8】
- 4、启动docker
systemctl enable docker
systemctl start docker
systemctl status docker
- 5、添加国内加速代理,设置storage-driver
cat > /etc/docker/daemon.json << EOF
{
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"registry-mirrors": ["https://gbwjji4e.mirror.aliyuncs.com"],
"insecure-registries":["172.18.17.169:5000"],
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
registry-mirrors
:表示公网的jia su qi 地址,可设置多个,地址需要添加协议头(https或者http)
。insecure-registries
:表示内网的私服地址,地址不能添加协议头(http)
。storage-driver
:表示使用OverlayFS的overlay2存储驱动。-
6、重启docker
systemctl daemon-reload
systemctl restart docker
4,安装nginx。
在172.18.17.169服务器上安装nginx,用于rancher-server负载均衡。
安装nginx:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx -y
sudo systemctl enable nginx.service
修改配置文件:
vi /etc/nginx/nginx.conf
user nginx;
worker_processes 4;
worker_rlimit_nofile 40000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 8192;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
# Gzip Settings
gzip on;
gzip_disable "msie6";
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_vary on;
gzip_static on;
gzip_proxied any;
gzip_min_length 0;
gzip_comp_level 8;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml application/font-woff text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobjectfont/woff2 image/x-icon image/png image/jpeg;
include /etc/nginx/conf.d/*.conf;
}
cd /etc/nginx/key (没有KEY则 mkdir key 创建这个文件夹), 里面放好rancher.ncd.ltd.crt和rancher.ncd.ltd.key 都是明文
cd /etc/nginx/conf.d
创建rancher.ncd.ltd.conf文件,内容如下:
upstream ups_rancher {
least_conn;
server 172.18.17.170:443 max_fails=3 fail_timeout=5s;
server 172.18.17.171:443 max_fails=3 fail_timeout=5s;
server 172.18.17.172:443 max_fails=3 fail_timeout=5s;
}
map $http_upgrade $connection_upgrade {
default Upgrade;
'' close;
}
server {
listen 443 ssl;
server_name rancher.ncd.ltd;
ssl_certificate /etc/nginx/key/rancher.ncd.ltd.crt;
ssl_certificate_key /etc/nginx/key/rancher.ncd.ltd.key;
access_log /var/log/nginx/rancher.ncd.ltd.access.log main;
location / {
proxy_pass https://ups_rancher;
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_connect_timeout 1200;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;#"upgrade";
}
}
server {
listen 80;
server_name rancher.ncd.ltd;
return 301 https://$server_name$request_uri;
}
###nginx.ncd.ltd.conf 内容:
server {
listen 80;
server_name nginx.ncd.ltd;
access_log /var/log/nginx/nginx.ncd.ltd.access.log main;
location / {
proxy_pass http://nginx-ing.default.172.18.17.170.xip.io/; #rancher ingress地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1200;
proxy_send_timeout 1200;
proxy_read_timeout 1200;
}
}
启动nginx:
sudo systemctl restart nginx.service
5,Rancher集群部署
1,安装必要工具
以下操作只需在172.18.17.170
这一台上操作即可。
- 安装rke:
su root
wget https://www.cnrancher.com/download/rke/v0.2.6-rke_linux-amd64
chmod +x v0.2.6-rke_linux-amd64
mv v0.2.6-rke_linux-amd64 /usr/bin/rke
- 安装kubectl:
wget https://www.cnrancher.com/download/kubernetes/linux-amd64-v1.15.1-kubectl
chmod +x linux-amd64-v1.15.1-kubectl
mv linux-amd64-v1.15.1-kubectl /usr/bin/kubectl
- 安装helm:
wget https://www.cnrancher.com/download/helm/helm-v2.13.1-linux-amd64.tar.gz
tar xf helm-v2.13.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/helm
mv linux-amd64/tiller /usr/bin/tiller
rm -rf helm-v2.13.1-linux-amd64.tar.gz linux-amd64/
其它工具下载地址:https://www.cnrancher.com/docs/rancher/v2.x/cn/install-prepare/download/
2,安装k8s
操作只需在172.18.17.170
这一台上操作即可。
- 1、切换到rancher用户
su - rancher
注意:
必须使用普通用户操作,否则后边的操作会报下边的错:
Please check if the configured user can execute `docker ps` on the node, and if the SSH server version is at least version 6.7 or higher. If youare using RedHat/CentOS, you can't use the user `root`. Please refer to the documentation for more instructions. Error: ssh: rejected: administratively prohibited (open failed)
- 2、创建rancher集群配置文件:
cat > rancher-cluster.yml << EOF
nodes:
- address: 172.18.17.170
user: rancher
role: [controlplane,worker,etcd]
- address: 172.18.17.171
user: rancher
role: [controlplane,worker,etcd]
- address: 172.18.17.172
user: rancher
role: [controlplane,worker,etcd]
services:
etcd:
snapshot: true
creation: 6h
retention: 24h
EOF
address
:公共域名或IP地址user
:可以运行docker命令的用户,需要是普通用户。role
:分配给节点的Kubernetes角色列表ssh_key_path
:用于对节点进行身份验证的SSH私钥的路径(默认为~/.ssh/id_rsa)
- 3、启动集群
$ rke up --config ./rancher-cluster.yml
如果这一步报错下边的内容:
if the SSH server version is at least version 6.7 or higher. If you are using RedHat/CentOS, you can't use the user `root`. Please refer to the documentation for more instructions
则可能是系统的openssh
版本太低,只需执行如下命令升级即可:
[rancher@localhost ~]$ ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 11 Feb 2013 #低于上边要求的6.7
[rancher@localhost ~]$ exit
[root@localhost ~]$ yum -y update openssh
[root@localhost ~]$ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
然后再切回rancher用户执行安装即可!
完成后,它应显示:Finished building Kubernetes cluster successfully。
并且已经创建了一个文件kube_config_rancher-cluster.yml。这个文件包含kubectl和helm访问K8S的凭据。
- 4、配置环境变量:
切换到root用户
su - root
vi /etc/profile
export KUBECONFIG=/home/rancher/kube_config_rancher-cluster.yml
保存,并执行:
source /etc/profile
保存kube_config_rancher-cluster.yml
和rancher-cluster.yml
文件的副本,后期维护和升级Rancher实例时将会用到。
- 5、通过kubectl测试您的连接,并查看您的所有节点是否处于Ready状态
先配置一下kubectl的命令补全功能。
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ source ~/.bashrc
$ su - rancher
$ echo "source <(kubectl completion bash)" >> ~/.bashrc
$ source ~/.bashrc
然后查看节点状态。
[root@node1 ~]$ su - rancher
[rancher@node1 ~]$ kubectl get node
由于需要联网下载docker镜像文件,所以需要一段时间才能安装好,10-30分钟左右。
- 6、检查集群Pod的运行状况
[rancher@node1 ~]$ kubectl get pods --all-namespaces
保存kube_config_rancher-cluster.yml和rancher-cluster.yml文件的副本,以后将需要这些文件来维护和升级Rancher实例。
3,Helm
Helm有两个部分:Helm客户端(helm)和Helm服务端(Tiller)。
使用Helm在集群上安装tiller服务以管理charts,由于RKE默认启用RBAC, 因此我们需要使用kubectl来创建一个serviceaccount,clusterrolebinding才能让tiller具有部署到集群的权限。
- 1、在kube-system命名空间中创建ServiceAccount:
kubectl -n kube-system create serviceaccount tiller
- 2、创建ClusterRoleBinding以授予tiller帐户对集群的访问权限:
kubectl create clusterrolebinding tiller --clusterrole cluster-admin --serviceaccount=kube-system:tiller
需要修改成国内镜像
kubectl --namespace=kube-system set image deployments/tiller-deploy tiller=registry.cn-hangzhou.aliyuncs.com/eryajf/tiller:v2.14.1
- 3、安装Helm Server(Tiller)
helm init --service-account tiller --tiller-image registry.cn-hangzhou.aliyuncs.com/eryajf/tiller:v2.14.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
- 4、安装Tiller金丝雀版本
helm init --service-account tiller --canary-image
升级命令: helm init --service-account tiller --tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:v2.14.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --upgrade
4,helm安装rancher
使用自签名证书安装Rancher server
Rancher server设计默认需要开启SSL/TLS配置来保证安全,将ssl证书以Kubernetes Secret卷的形式传递给rancher server或Ingress Controller。首先创建证书密文,以便Rancher和Ingress Controller可以使用。
1,生成自签名证书
#脚本
一键生成自签名证书脚本
#执行脚本生成证书
sh create_self-signed-cert.sh --ssl-domain=rancher.ncd.ltd --ssl-trusted-ip=172.18.17.169,172.18.17.170,172.18.17.171,172.18.17.172,172.18.17.180,172.18.17.181,172.18.17.182 --ssl-size=2048 --ssl-date=3650
2,使用kubectl创建tls类型的secrets
#创建命名空间
kubectl create namespace cattle-system
#服务证书和私钥密文
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key
#ca证书密文
kubectl -n cattle-system create secret generic tls-ca --from-file=cacerts.pem
获取证书
kubectl get secret tls-rancher-ingress -n cattle-system -o yaml
###将data中的tls.crt 、tls.key用base解码至正常格式,添加进证书中
解码
将data中的tls.crt 、tls.key用base64解码至正常格式,添加进证书中
添加Chart仓库地址
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
- 查看是否添加成功
helm repo list
3,安装rancher server
#使用helm安装rancher HA
注:自定义域名和证书申请的域名要保持一致
helm install rancher-stable/rancher \
--name rancher \
--namespace cattle-system \
--set hostname=rancher.ncd.ltd \
--set ingress.tls.source=secret \
--set privateCA=true
验证 Rancher Server 运行情况,查看是否部署成功
helm list
查看 pod
kubectl get deployment -n cattle-system
安装rancher server出错,可以用 helm delete --purge rancher 删除后 重新执行
#查看创建
由于我们通过hosts文件来添加映射,所以需要为Agent Pod添加主机别名(/etc/hosts)[在172.18.17.170机器上执行以下2个配置内容]:
kubectl -n cattle-system patch deployments cattle-cluster-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"rancher.ncd.ltd"
],
"ip": "172.18.17.169"
}
]
}
}
}
}'
这一步如果马上执行,可能会报错:Error from server (NotFound): deployments.extensions "cattle-cluster-agent" not found
,这个deployment是上一步install时创建的,比较慢,耐心等待一下,这个时候也可以先跳过这里,去到后边,简单配置一下,访问一下rancher的界面。
kubectl -n cattle-system patch daemonsets cattle-node-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"rancher.ncd.ltd"
],
"ip": "172.18.17.169"
}
]
}
}
}
}'
5,登录rancher管理端
- 1、同样将刚刚的域名映射关系写入到Windows主机的hosts文件(内网的做法)。
172.18.17.169 rancher.ncd.ltd
- 2、使用域名访问https://rancher.ncd.ltd
刚进入,会看到一个问题。
报这个问题的原因就是刚刚创建的cattle-cluster-agent
还没有被创建成功,同样耐心等待即可。这个时候可以随便点点看看先。这个过程与自己的网络有关,这时也可以在node1主机上,通过如下命令进行一个监控。
在我这里,等了十分钟左右,才开始正式的部署。这个时候,可以返回到上边,将那两条命令导入进去。
操作之后,然后再看rancher,就不会报连接问题了。
到这里,基本上安装步骤也就完成了,可以随便点点看看界面里边的各项功能什么的。
worker1 | 172.18.17.180 | Rancker-agent-node |
worker2 | 172.18.17.181 | Rancker-agent-node |
worker3 | 172.18.17.182 | Rancker-agent-node |
将这3台机器在rancher控制面板上创建新的集群集成进来,以后的部署服务都往worker node上去做.
-----清理k8s-------
#删除所有容器
sudo docker rm -f $(sudo docker ps -qa)
#删除/var/etcd目录
sudo rm -rf /var/etcd
#删除/var/lib/kubelet/目录,删除前先卸载
for m in $(sudo tac /proc/mounts | sudo awk '{print $2}'|sudo grep /var/lib/kubelet);do
sudo umount $m||true
done
sudo rm -rf /var/lib/kubelet/
#删除/var/lib/rancher/目录,删除前先卸载
for m in $(sudo tac /proc/mounts | sudo awk '{print $2}'|sudo grep /var/lib/rancher);do
sudo umount $m||true
done
sudo rm -rf /var/lib/rancher/
#删除/run/kubernetes/ 目录
sudo rm -rf /run/kubernetes/
#删除所有的数据卷
sudo docker volume rm $(sudo docker volume ls -q)
#再次显示所有的容器和数据卷,确保没有残留
sudo docker ps -a
sudo docker volume ls