在網上看了不少關於Kubernetes的視頻,雖然現在還未用上,但是也是時候總結記錄一下,父親常教我的一句話:學到手的東西總有一天會有用!我也相信在將來的某一天會用到現在所學的技術。廢話不多扯了。。。。
一、前期准備
1、k8s-master01:master主服務器(存在單點故障)
2、k8s-node01、k8s-node02:2個工作節點
3、Harbor:私有倉庫(簡單記錄搭建Harbor私服倉庫)
4、Router:軟路由(由於kubeadm是存放在谷歌雲的,國內無法訪問,K8S集群搭建之軟路由的安裝)
二、系統初始化
以下操作均是對3個K8S節點進行操作
1、設置系統主機名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node02
2、hosts文件相互解析
vi /etc/hosts,添加如下配置
192.168.66.10 k8s-master01
192.168.66.20 k8s-node01 192.168.66.21 k8s-node02
3、安裝依賴包
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
4、設置防火牆為iptables並設置空規則
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
5、關閉selinux(防止pod運行在虛擬內存)
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
6、調整內核參數,對於K8S
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nv_conntrack_max=2310720 EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -f /etc/sysctl.d/kubernetes.conf
7、調整系統時區
#設置xiton.g時區為 中國/上海
timedatectl set-timezone Asia/Shanghai #將當前的UTC時間寫入硬件時鍾 timedatectl set-local-rtc 0 #重啟依賴於系統時間的服務 systemctl restart rsyslog systemctl restart crond
8、關閉系統不需要服務
systemctl stop postfix && systemctl disable postfix
9、設置rsyslogd和systemd journald
mkdir /var/log/journal #持久化保存日志的目錄
mkdir /etc/systemd/journald.conf.d mkdir > /etc/systemd/journald.conf.d <<EOF [Journal] #持久化保存到磁盤 Storage=persistent #壓縮歷史日志 Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 #最大占用空間10G SystemMaxUse=10G #單日志文件最大200M SystemMaxFileSize=200M #日志保存時間2周 MaxRetentionSec=2week #不將日志轉發達 syslog ForwardToSyslog=no EOF
systemctl restart systemd-journald
10、升級系統內核為4.4
CentOS7.x自帶的3.10.x內核存在一些Bugs,導致運行的Docker、ku'bernetes不穩定。
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安裝完成后檢查 /boot/grub2/grub.cfg中對應內核menuentry中是否包含initrd16配置,如果沒有,再安裝一次
yum --enablerepo=elrepo-kernel install -y kernel-lt #設置開機從新內核啟動 grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)' #重啟機器 reboot
三、Docker相關設置(3個節點)
1、配置daemon
vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"], "log-driver":"json-file", "log-opts": { "max-size":"100m" } }
2、新建目錄
mkdir -p /etc/systemd/system/docker.service.d
3、重啟Docker
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
四、安裝Kubeadm(主從配置)
1、配置鏡像源、啟動kubelet
地址:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.53322f70MCb4ok
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
yum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1
systemctl enable kubelet.service
可能會先出現無socat依賴:可參考我這篇文章:Linux下RabbitMQ的安裝及使用里面有安裝socat依賴的過程
2、導入鏡像
2.1、kubeadm初始化k8s集群時會從谷歌雲中拉取鏡像,國內是無法訪問的。
所以這里需要導入鏡像,這里從別人通過kexue上網拉取的鏡像:https://pan.baidu.com/share/init?surl=yrbtLGXqXaXmauScaif-3A,提取碼:r6m5
2.2、解壓壓縮包
tar -xvf kubeadm-basic.images.tar.gz
2.3、編寫導入鏡像腳本
#!/bin/bash
ls /root/kubeadm-basic.images > /tmp/image-list.txt cd /root/kubeadm-basic.images for i in $(cat /tmp/image-list.txt) do docker load -i $i done rm -rf /tmp/image-list.txt
2.4、賦予執行權限
chmod a+x load-images.sh
2.5、執行導入鏡像腳本:./load-images.sh
2.6、將鏡像目錄、導入鏡像腳本遠程拷貝至2個從節點、並執行對應導入鏡像腳本
scp -r kubeadm-basic.images load-images.sh root@k8s-node01:/root/
scp -r kubeadm-basic.images load-images.sh root@k8s-node02:/root/
./load-images.sh #root家目錄執行該腳本
3、主節點初始化
3.1、獲取初始化配置模板
kubeadm config print init-defaults > kubeadm-config.yaml #將初始化文件打印至目標文件
3.2、編輯初始配置模板:vim kubeadm-config.yaml

3.3、主節點初始化安裝
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
依次執行3條命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
4、網絡部署
由上一步可以看出,node狀態處於notready,這是我們沒有實現扁平化網絡,現在部署一下
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl create -f kube-flannel.yml
kubectl get pod -n kube-system
kubectl get node #再次查看狀態
ifconfig也可查看到flannel
5、其他節點加入
命令已經在在主節點初始化時日志里如下:
kubeadm join 192.168.66.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:5be585a83158dedce452998083eda3ba40a578b9e7361b366670a4dd80e47edb
在master主節點查看:kubectl get node
五、配置私有倉庫Harbor(3個節點)
參考這里搭建私有倉庫Harbor:簡單記錄搭建Harbor私服倉庫
1、配置docker的daemon.json文件
{
"exec-opts":["native.cgroupdriver=systemd"], "insecure-registries": ["hub.rmitec.com"], "log-driver":"json-file", "log-opts": { "max-size":"100m" } }
2、配置本機hosts文件映射
192.168.66.10 k8s-master01
192.168.66.20 k8s-node01 192.168.66.21 k8s-node02 192.168.66.15 hub.rmitec.com
3、重啟docker
systemctl restart docker
4、k8s節點操作(node節點),登錄harbor私服倉庫,用戶民:admin,密碼:Harbor12345
5、查看私有倉庫鏡像(可以看出該鏡像下載次數為0)
六、集群測試
1、master主節點運行pod
kubectl run nginx-deployment --image=hub.rmitec.com/library/mynginx:v1.0 --replicas=1 #運行nginx,指定副本數為1,從私有倉庫Harbor
kubectl get deployment
kubectl get rs
kubectl get pod
kubectl get pod -o wide
注:可以看出該nginx運行在node02節點,可以在node02節點查看
2、master節點訪問測試:curl 10.244.2.2(/hostname)
3、查看私有倉庫鏡像狀態
4、pod彈性伸縮
注:可以看到node02運行2個nginx,node01運行1個nginx
5、SVC做負載均衡
kubectl get svc
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
6、curl訪問:curl 10.97.248.212:30000
7、ipvadm -Ln查看
8、對外暴露訪問
8.1修改type類型為NodePort
kubectl edit svc nginx-deployment
8.2再次查看type類型
8.3外網測試
8.3.1瀏覽器訪問:http://192.168.66.10:30525/,測試成功
8.3.2 瀏覽器訪問:http://192.168.66.20:30525/(node01節點)
8.3.3瀏覽器訪問:http://192.168.66.21:30525/(node02節點)