一、准備工作
1.1 操作系統版本
CentOS Linux release 7.6.1810 (Core)
1.2 節點信息
節點名稱 | ip | 安裝組件 |
---|---|---|
node1 | 192.168.1.156 | etcd, docker, k8s |
node2 | 192.168.1.167 | etcd, docker, k8s |
node3 | 192.168.1.168 | etcd, docker, k8s |
nginx | 192.168.1.178 | nginx |
1.3 軟件版本
-
rancher-2.3.3
-
kubernetes-1.13.5
-
rke-v0.2.2
-
kubectl-v1.13.5
-
helm-v2.13.1
-
tiller-v2.13.1
1.4 軟件准備
本次部署的包都放在百度網盤,下載之后部署,以保證部署過程的流暢。
鏈接:https://pan.baidu.com/s/1vIOU3LPRcCNyfxam4j7Y9g 提取碼:zwuj
1.5 架構示意圖
二、初始化環境
初始化操作在3台node節點都要執行。
2.1 關閉相關服務
1、關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
2、關閉selinux
$ sudo setenforce 0
$ grep SELINUX /etc/selinux/config
SELINUX=disabled
3、關閉swap
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2.2 設置主機名
1、修改主機名,然后重新登陸
$ sudo hostnamectl set-hostname node1
$ sudo hostnamectl set-hostname node2
$ sudo hostnamectl set-hostname node3
2、設置主機名保存在/etc/hosts文件中
$ cat > /etc/hosts << EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.156 node1
192.168.1.167 node2
192.168.1.168 node3
EOF
2.3 操作系統內核參數調整
1、修改文件打開數
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
2、內核其他參數
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
2.4 安裝基礎軟件
yum -y install wget ntpdate lrzsz curl yum-utils device-mapper-persistent-data lvm2 bash-completion && ntpdate -u cn.pool.ntp.org
2.5 創建用戶及免密登陸
1、創建用戶並添加到docker組
groupadd docker
useradd rancher -G docker
echo "123456" | passwd --stdin rancher
這一步非常重要,如果沒有操作,則后邊可能會有報錯等問題。
2、設置ssh免密登錄
在node1
服務器上執行下面的命令:
su - rancher
ssh-keygen
ssh-copy-id rancher@192.168.1.156
ssh-copy-id rancher@192.168.1.167
ssh-copy-id rancher@192.168.1.168
說明:
通過授權node1主機對三台主機的免密碼登陸,為后邊安裝k8s的步驟做好准備工作。
三、部署過程
3.1 安裝docker
需要在三台主機上一起安裝docker。
rke工具目前只支持docker v17.03.2,請務必保持版本一致,否則后續安裝會報錯。
1、安裝repo源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
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、安裝docker-ce-17.03.2
yum -y install --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos docker-ce-selinux-17.03.2.ce-1.el7.centos
4、啟動docker
$ systemctl enable docker
$ systemctl start docker
$ systemctl status docker
5、添加國內加速代理
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://kw88y6eh.mirror.aliyuncs.com"],
"insecure-registries":["192.168.1.153"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
-
registry-mirrors
:表示公網的加速器地址,可設置多個,地址需要添加協議頭(https或者http)
。 -
insecure-registries
:表示內網的私服地址,地址不能添加協議頭(http)
。 -
storage-driver
:表示使用OverlayFS的overlay2存儲驅動。
6、重啟docker
systemctl daemon-reload
systemctl restart docker
3.2 安裝nginx
在192.168.1.178機器上安裝nginx,用於rancher-server負載均衡。
1、安裝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
2、修改nginx配置文件
user nginx;
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
http {
# 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;
server {
listen 80;
return 301 https://$host$request_uri;
}
}
stream {
upstream rancher_servers {
least_conn;
server 192.168.1.156:443 max_fails=3 fail_timeout=5s;
server 192.168.1.167:443 max_fails=3 fail_timeout=5s;
server 192.168.1.168:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers;
}
}
3、啟動nginx
sudo systemctl restart nginx.service
3.3 Rancher集群部署
3.3.1、安裝必要工具
以下操作只在192.168.1.156
(即node1節點)上執行即可。
1、安裝rke
su - root
wget https://www.cnrancher.com/download/rke/rke_linux-amd64
chmod +x rke_linux-amd64
mv rke_linux-amd64 /usr/bin/rke
2、安裝kubectl
wget https://www.cnrancher.com/download/kubectl/kubectl_amd64-linux
chmod +x kubectl_amd64-linux
mv kubectl_amd64-linux /usr/bin/kubectl
3、安裝helm
wget https://www.cnrancher.com/download/helm/helm-linux.tar.gz
tar xf helm-linux.tar.gz
mv linux-amd64/helm /usr/bin/helm
mv linux-amd64/tiller /usr/bin/tiller
rm -rf helm-linux.tar.gz linux-amd64/
其他工具下載地址:
https://www.cnrancher.com/docs/rancher/v2.x/cn/install-prepare/download/
3.3.2 安裝k8s
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: 192.168.1.156
user: rancher
role: [controlplane,worker,etcd]
- address: 192.168.1.167
user: rancher
role: [controlplane,worker,etcd]
- address: 192.168.1.168
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
完成后,它應顯示: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
NAME STATUS ROLES AGE VERSION
192.168.111.3 Ready controlplane,etcd,worker 10m v1.13.5
192.168.111.4 Ready controlplane,etcd,worker 10m v1.13.5
192.168.111.5 Ready controlplane,etcd,worker 10m v1.13.5
由於需要聯網下載docker鏡像文件,所以需要一段時間才能安裝好,10-30分鍾左右。
6、檢查集群Pod的運行狀況
[rancher@node1 ~]$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx default-http-backend-78fccfc5d9-j8v5h 1/1 Running 0 9m45s
ingress-nginx nginx-ingress-controller-cpb9t 1/1 Running 0 9m16s
ingress-nginx nginx-ingress-controller-fzcdl 1/1 Running 0 9m16s
ingress-nginx nginx-ingress-controller-n2f5b 1/1 Running 0 9m36s
kube-system canal-9vzxn 2/2 Running 0 9m59s
kube-system canal-p8t59 2/2 Running 0 9m59s
kube-system canal-v8nhz 2/2 Running 0 9m59s
kube-system kube-dns-58bd5b8dd7-dp8nk 3/3 Running 0 9m55s
kube-system kube-dns-autoscaler-77bc5fd84-t2jht 1/1 Running 0 9m54s
kube-system metrics-server-58bd5dd8d7-pr6nh 1/1 Running 0 9m50s
kube-system rke-ingress-controller-deploy-job-qh82s 0/1 Completed 0 9m46s
kube-system rke-kube-dns-addon-deploy-job-g95sp 0/1 Completed 0 9m56s
kube-system rke-metrics-addon-deploy-job-mmk57 0/1 Completed 0 9m51s
kube-system rke-network-plugin-deploy-job-b75ds 0/1 Completed 0 10m
保存kube_config_rancher-cluster.yml和rancher-cluster.yml文件的副本,以后將需要這些文件來維護和升級Rancher實例。
3.3.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
3、安裝Helm Server(Tiller)
helm init --service-account tiller --tiller-image registry.cn-hangzhou.aliyuncs.com/eryajf/tiller:v2.13.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
4、安裝Tiller金絲雀版本
helm init --service-account tiller --canary-image
需要修改成國內鏡像(可能需要delete再重新init)
kubectl --namespace=kube-system set image deployments/tiller-deploy tiller=registry.cn-hangzhou.aliyuncs.com/eryajf/tiller:v2.13.1
3.3.4 helm安裝rancher
1、添加Chart倉庫地址
使用helm repo add命令添加Rancher chart倉庫地址,訪問Rancher tag和Chart版本 替換為您要使用的Helm倉庫分支(即latest或stable)。
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
2、安裝證書管理器
-
1、只有Rancher自動生成的證書和LetsEncrypt頒發的證書才需要cert-manager。如果是你自己的證書,可使用ingress.tls.source=secret參數指定證書,並跳過此步驟。
helm install stable/cert-manager \
--name cert-manager \
--namespace kube-system
-
2、Rancher自動生成證書
默認情況下,Rancher會自動生成CA根證書並使用cert-manager頒發證書以訪問Rancher server界面。
唯一的要求是將hostname配置為訪問Rancher的域名地址,使用這種SSL證書配置方式需提前安裝證書管理器。
helm install rancher-stable/rancher \
--name rancher \
--namespace cattle-system \
--set hostname=rancher.com
rancher.com就是后面訪問rancher的域名,需要在/etc/hosts文件中添加關聯(所有主機):
[root@node1 ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts
[root@node2 ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts
[root@node3 ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts
[root@nginx ~]$ echo "192.168.1.178 rancher.com" >> /etc/hosts
由於我們通過hosts文件來添加映射,所以需要為Agent Pod添加主機別名(/etc/hosts):
kubectl -n cattle-system patch deployments cattle-cluster-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"rancher.com"
],
"ip": "192.168.1.178"
}
]
}
}
}
}'
這一步如果馬上執行,可能會報錯: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.com"
],
"ip": "192.168.1.178"
}
]
}
}
}
}'
3.3.5 登錄rancher管理端
-
1、同樣將剛剛的域名映射關系寫入到Windows主機的hosts文件。
192.168.1.178 rancher.com
-
2、使用域名訪問https://rancher.com
輸入:admin/admin,進入首頁界面。
報這個問題的原因就是剛剛創建的cattle-cluster-agent
還沒有被創建成功,同樣耐心等待即可。這個時候可以隨便點點看看先。這個過程與自己的網絡有關,這時也可以在node1主機上,通過如下命令進行一個監控。
[rancher@node1 ~]$ kubectl get -n cattle-system pod -w
NAME READY STATUS RESTARTS AGE
rancher-bdf49fb9-7qhgp 1/1 Running 1 12m
rancher-bdf49fb9-hf6tm 1/1 Running 0 12m
rancher-bdf49fb9-xmbv7 1/1 Running 1 12m
cattle-cluster-agent-7b54db4bc8-r4blg 0/1 Pending 0 0s
cattle-cluster-agent-7b54db4bc8-r4blg 0/1 Pending 0 0s
cattle-cluster-agent-7b54db4bc8-r4blg 0/1 ContainerCreating 0 0s
cattle-node-agent-mskmb 0/1 Pending 0 0s
cattle-node-agent-2cmww 0/1 Pending 0 0s
cattle-node-agent-kkpvn 0/1 Pending 0 0s
cattle-node-agent-mskmb 0/1 ContainerCreating 0 0s
cattle-node-agent-kkpvn 0/1 ContainerCreating 0 0s
cattle-node-agent-2cmww 0/1 ContainerCreating 0 0s
在我這里,等了十分鍾左右,才開始正式的部署。這個時候,可以返回到上邊,將那兩條命令導入進去。操作之后,然后再看rancher,就不會報連接問題了。
到這里,基本上安裝步驟也就完成了。
四、高可用測試
1、關閉node1節點
[root@node1 ~]# init 0
2、觀察rancher的訪問 從下圖所我們可以看到,rancher依然可以正常訪問,從而實現高可用目的。
五、排錯
1、在執行rke up --config ./rancher-cluster.yml報認證失敗
解決方法:
docker stop $(docker ps -aq)
docker system prune -f
docker volume rm $(docker volume ls -q)
docker image rm $(docker image ls -q)
rm -rf /etc/ceph \
/etc/cni \
/etc/kubernetes \
/opt/cni \
/opt/rke \
/run/secrets/kubernetes.io \
/run/calico \
/run/flannel \
/var/lib/calico \
/var/lib/etcd \
/var/lib/cni \
/var/lib/kubelet \
/var/lib/rancher/rke/log \
/var/log/containers \
/var/log/pods \
/var/run/calico