使用家里閑置的單台家用台式機搭建kubernetes高可用多master集群環境
硬件介紹
cpu i5-10600KF六核心 十二線程
內存:8G*2 、16G*2 總共48G
磁盤:SSD480G*2 SSD250G*2 HDD2T*1
資源規划
主機:win10專業版
虛擬機:vmware:wmware16 por
centos7虛擬機總共9個,名稱和資源划分如下
9台centos7虛擬機中5台用於k8s集群,3台用於數據存儲,1台用於測試
k8s集群包含3個master節點、2個node節點。3台master所在虛擬機安裝nginx、Keepalived、ipvs實現高可用
數據存儲包含一個mysql集群和一個gluster文件系統
centos7安裝和環境配置
假設已經使用vmware安裝一台centos7虛擬機,進去虛擬機,進行如下設置
1關閉防火牆和NetworkManager
systemctl stop NetworkManager && systemctl disable NetworkManager
systemctl stop firewalld && systemctl disable firewalld
2永久關閉selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config;cat /etc/selinux/config
3修改主機名
hostnamectl set-hostname master-1
4修改hosts文件
cat >> /etc/hosts << EOF
192.168.2.191 master-1
192.168.2.192 master-2
192.168.2.193 master-3
192.168.2.194 node-1
192.168.2.195 node-2
EOF
5禁用swap
swapoff -a
sed -i.bak '/swap/s/^/#/' /etc/fstab
6內核參數修改
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
立即生效:
sysctl -p /etc/sysctl.d/k8s.conf
7新增kubernetes源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
##########################
[] 中括號中的是repository id,唯一,用來標識不同倉庫
name 倉庫名稱,自定義
baseurl 倉庫地址
enable 是否啟用該倉庫,默認為1表示啟用
gpgcheck 是否驗證從該倉庫獲得程序包的合法性,1為驗證
repo_gpgcheck 是否驗證元數據的合法性 元數據就是程序包列表,1為驗證
gpgkey=URL 數字簽名的公鑰文件所在位置,如果gpgcheck值為1,此處就需要指定gpgkey文件的位置,如果gpgcheck值為0就不需要此項了
8更新緩存
yum clean all
yum -y makecache
9安裝命令補全
1 安裝bash-completion
yum -y install bash-completion
2 加載bash-completion
source /etc/profile.d/bash_completion.sh
10安裝docker
1安裝依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
2設置Docker源
#推薦使用國內的
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3安裝Docker CE
docker可安裝版本查看
yum list docker-ce --showduplicates | sort -r
安裝docker
yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io -y
4啟動Docker並開機自啟
systemctl start docker
systemctl enable docker
5配置鏡像加速
由於Docker Hub的服務器在國外,下載鏡像會比較慢,可以配置鏡像加速器提速
配置daemon.json文件:
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"]
}
6修改Cgroup Driver
修改daemon.json 新增‘”exec-opts”: [“native.cgroupdriver=systemd”’
修改cgroupdriver是為了消除告警:
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver...
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://23h04een.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
7重啟docker
systemctl daemon-reload
systemctl restart docker
11安裝iptables
ipvs
1安裝iptables
yum install iptables-services -y
2禁用iptables
systemctl disable iptables && systemctl stop iptables
3清空防火牆規則
iptables -F
4創建ipvs.modules文件
vim /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ 0 -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
5執行腳本
bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
#不開啟ipvs將會使用iptables進行數據包轉發,但是效率低,所以官網推薦需要開通ipvs
12安裝其他必要軟件
yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet rsync
centos7虛擬機快速創建
1.關閉上虛擬機
2.使用vmware的導出OVF功能,導出OVF
3.使用導出的OVF文件快速創建多個虛擬機
4.修改每台虛擬機的hostname和網絡配置,指定不同的內網ip,重啟網絡,即可xshell遠程連接
部署nginx、keepalived
在所有master節點部署nginx及keepalived
如下步驟僅需在master1、master2、master3三台虛擬機執行
安裝nginx、keepalived
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx keepalived -y
編輯ngin配置文件
vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
# 四層負載均衡,為兩台Master apiserver組件提供負載均衡
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/k8s-access.log main;
upstream k8s-apiserver {
server 192.168.2.191:6443; # centos7-1-master1 APISERVER IP:PORT
server 192.168.2.192:6443; # centos7-1-master2 APISERVER IP:PORT
server 192.168.2.193:6443; # centos7-1-master3 APISERVER IP:PORT
}
server {
listen 64430; # 由於nginx與master節點復用,這個監聽端口不能是6443,否則會沖突
proxy_pass k8s-apiserver;
}
}
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 8000 default_server;
server_name _;
location / {
}
}
}
啟動nginx
systemctl start nginx && systemctl enable nginx
編輯keepalive配置文件
>注意每台虛擬機keepalived.conf的帶#注釋部分需設置不一樣的
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.bak
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 # 修改為實際網卡名,根據實際網卡名字設置
virtual_router_id 192 # VRRP 路由 ID實例,每個實例是唯一的 ,三台虛擬機設置成不一樣
priority 100 # 優先級,三台虛擬機設置成不一樣
advert_int 1 # 指定VRRP 心跳包通告間隔時間,默認1秒
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬IP
virtual_ipaddress {
192.168.2.100/24
}
track_script {
check_nginx
}
}
創建keepalived用的判斷故障腳本
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
count=$(ps -ef |grep nginx | grep sbin | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
systemctl stop keepalived
fi
[root@k8s-master2 ~]# chmod +x /etc/keepalived/check_nginx.sh
#注:keepalived根據腳本返回狀態碼(0為工作正常,非0不正常)判斷是否故障轉移。
啟動keepalived
systemctl start keepalived && systemctl enable keepalived
測試
...
安裝k8s
通過上一步操作得到5台虛擬機
在每一台虛擬機執行如下操作
1可安裝版本查看
yum list kubelet --showduplicates | sort -r
2安裝kubelet、kubeadm和kubectl
1 安裝
yum install -y kubelet-1.23.5 kubeadm-1.23.5 kubectl-1.23.5
#kubelet 運行在集群所有節點上,用於啟動Pod和容器等對象的工具
#kubeadm 用於初始化集群,啟動集群的命令工具
#kubectl 用於和集群通信的命令行,通過kubectl可以部署和管理應用,查看各種資源,創建、刪除和更新各種組件
2 啟動kubelet並設置開機啟動
systemctl enable kubelet && systemctl start kubelet
3 kubectl命令補全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile
3准備kubernete必要容器鏡像
Kubernetes幾乎所有的安裝組件和Docker鏡像都放在goolge自己的網站上,直接訪問可能會有網絡問題
解決辦法:
從阿里雲鏡像倉庫下載鏡像,拉取到本地以后改回默認的鏡像tag。使用如下腳本實現。
1 鏡像下載的腳本
cat image.sh
#!/bin/bash
url=registry.aliyuncs.com/google_containers
version=v1.23.5
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
done
#url為阿里雲鏡像倉庫地址,version為安裝的kubernetes版本。
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.6 && docker tag registry.aliyuncs.com/google_containers/coredns:1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
#coredns鏡像可能要手動pull,kubeadm執行初始化時需要
2 運行腳本image.sh下載鏡像
sh image.sh
# 注意 :每個節點都要執行,否則部分k8s必要的容器創建不成功
4初始化Master
任選一個master節點執行本部分操作(此處選的master-1)。
kubeadm init --apiserver-advertise-address=192.168.2.191 --kubernetes-version v1.23.5 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --upload-certs --control-plane-endpoint 192.168.2.100:64430
# 192.168.2.100 是vip
#記錄上述面命令安裝成功后的輸出,后面需要這個命令將node節點和其他master節點加入集群中。
#注意master節點加入和node節點加入使用的參數是不一樣的,如下圖,上面一條是master用的、下面一條是node用的
如果初始化失敗,可執行kubeadm reset后重新初始化
kubeadm reset
rm -rf $HOME/.kube/config
加載環境變量,否則執行kubectl get node 會報錯The connection to the server localhost:8080 was refused
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile
拷貝證書(忘了是否必要執行次步驟以及何時執行)-----------------------------------?????
scp root@192.168.2.191:/etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/ca.crt
scp root@192.168.2.191:/etc/kubernetes/pki/ca.key /etc/kubernetes/pki/ca.key
scp root@192.168.2.191:/etc/kubernetes/pki/sa.key /etc/kubernetes/pki/sa.key
scp root@192.168.2.191:/etc/kubernetes/pki/sa.pub /etc/kubernetes/pki/sa.pub
scp root@192.168.2.191:/etc/kubernetes/pki/front-proxy-ca.crt /etc/kubernetes/pki/front-proxy-ca.crt
scp root@192.168.2.191:/etc/kubernetes/pki/front-proxy-ca.key /etc/kubernetes/pki/front-proxy-ca.key
scp root@192.168.2.191:/etc/kubernetes/pki/etcd/ca.crt /etc/kubernetes/pki/etcd/ca.crt
scp root@192.168.2.191:/etc/kubernetes/pki/etcd/ca.key /etc/kubernetes/pki/etcd/ca.key
scp root@192.168.2.191:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf
加入集群
在加入集群前先關閉nginx ,預防訪問192.168.2.100:64430被路由到master-2、master-2上導致添加失敗
因為有監控腳本,當nginx關閉后,對應主機上的vip也會關閉
等所有節點都成功加入集群,再啟動nginx
在master-2、master-3 執行:
kubeadm join 192.168.2.100:64430 --token o0l7ya.8sr0b70ywafxe1m9 \
--discovery-token-ca-cert-hash sha256:xxx \
--control-plane --certificate-key xxx
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
在node-1、node-2 執行:
kubeadm join 192.168.2.100:64430 --token o0l7ya.8sr0b70ywafxe1m9 \
--discovery-token-ca-cert-hash sha256:xxx
添加成功會提示如下信息:
在master-1查看所有節點狀態:
#圖示所有的節點狀態正常
安裝calico網絡
為什么不用flannel,好像安裝時遇到過問題搞不好,就用了calico
在任意主節點下載calico.yaml
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
修改calico.yaml (忽略此步驟)
...
#當使用kubeadm時,PodIP的范圍應該與kubeadm init的清單文件中的"podSubnet"字段或者"--pod-network-cidr"選項填寫的值相
查看calico.yaml用了哪些容器,並在所有節點上pull容器
docker pull docker.io/calico/cni:v3.23.1
docker pull docker.io/calico/kube-controllers:v3.23.1
docker pull docker.io/calico/node:v3.23.1
在該主節點執行安裝
kubectl apply -f calico.yaml
查看pod狀態
kubectl get pods --all-namespaces
#狀態應當全部是running
在k8s安裝Dashboard
Dashboard提供了可以實現集群管理、工作負載、服務發現和負載均衡、存儲、字典配置、日志視圖等功能。
下載yaml
dashboard:v2.5.1已支持k8s:1.23.x
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
修改yaml(鏡像可以支持下載忽略此步驟)
#修改鏡像地址(由於默認的鏡像倉庫網絡訪問不通,故改成阿里鏡像)
#sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml
token失效較快,可設置參數延長失效時間- --token-ttl=432000,位置如下
映射到主機端口
sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml
#配置NodePort,外部通過https://NodeIp:NodePort 訪問Dashboard,此時端口為30001
部署
kubectl apply -f recommended.yaml
狀態查看
kubectl get all -n kubernetes-dashboard
令牌生成
創建service accou nt並綁定默認cluster-admin管理員集群角色:
創建用戶
kubectl create serviceaccount dashboard-admin -n kube-system
用戶授權
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
令牌查看
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
訪問測試
外部通過https://NodeIp:NodePort 訪問Dashboard,此時端口為30001,默認運行在3個master任意一節點上,需要手動查看哪個機子開啟了30001端口
選擇token方式登錄,輸入“3.4 令牌查看” 獲得的token,即可進入頁面
注意:
默認情況下只能使用https訪問,但chrome可能會提示不安全,此時在瀏覽器當前頁面下鍵盤敲擊thisisunsafe可繼續訪問,
火狐瀏覽器可正常進入,不會提示不安全。