Kubernetes 集群安裝
前期准備
第一步:Router軟路由構建
第二步:centos7安裝 5台(自行安裝)
鏈接:https://pan.baidu.com/s/1WIMdpo1TPYLwwLiu6Bk5-w
提取碼:p7go
復制這段內容后打開百度網盤手機App,操作更方便哦
1、安裝k8s的節點必須是大於1核心的CPU
2、安裝節點的網絡信息
master
BOOTPROTO=static IPADDR=10.0.100.10 NETMASK=255.255.255.0 GATEWAY=10.0.100.8 #指定到koolshare的軟路由上 node1 BOOTPROTO=static IPADDR=10.0.100.11 NETMASK=255.255.255.0 GATEWAY=10.0.100.8 node2 BOOTPROTO=static IPADDR=10.0.100.12 NETMASK=255.255.255.0 GATEWAY=10.0.100.8
3、koolshare 軟路由的默認面是koolshare
集群安裝
系統初始化
設置系統主機名以及Host文件
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
安裝依賴包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
設置防火牆為Iptables並設置空規則
systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
關閉SELINUX
因為K8s安裝的時候會去檢測swap分區有無關閉,如果開啟了話可能會把pod放在虛擬內存運行,大大降低工作效率。(也可以通過–ingress排除)
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
調整內核參數,對於K8s
必備三調參數:開啟bridge網橋模式,關閉ipv6協議
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 # 禁止使用swap空間,只有當系統OOM時才允許使用它 vm.overcommit_memory=1 # 不檢查物理內存是否夠用 vm.panic_on_oom=0 # 開啟OOM 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.nf_conntrack_max=2310720 EOF cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf
報錯1:顯示/proc/sys/net/bridge/bridge-nf-call-iptables:沒有這個文件或者目錄
modprobe br_netfilter
報錯2:顯示sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: 沒有那個文件或目錄
modprobe ip_conntrack
調整系統時區
# 設置系統時區為 中國/上海 timedatectl set-timezone Asia/Shanghai # 將當前的UTC時間寫入硬件時鍾 timedatectl set-local-rtc 0 # 重啟依賴於系統時間的服務 systemctl restart rsyslog systemctl restart crond
關閉系統不需要的服務
systemctl stop postfix && systemctl disable postfix
設置rsyslogd和systemd journald
讓journald控制轉發
mkdir /var/log/journal # 持久化保存日志的目錄 mkdir /etc/systemd/journald.conf.d # 配置文件存放目錄 # 創建配置文件 cat > /etc/systemd/journald.conf.d/99-prophet.conf << 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
修改系統內核為4.44
CentOS 7.x系統自帶的3.10x內核存在一些Bugs,導致運行的Docker、Kubernetes不穩定。
rpm -Uvh http://mirror.ventraip.net.au/elrepo/elrepo/el7/x86_64/RPMS/elrepo-release-7.0-4.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.182-1.el7.elrepo.x86_64) 7 (Core)" 檢測: [root@k8s-master01 ~]# uname -r 4.4.237-1.el7.elrepo.x86_64
修改DNS
vim /etc/hosts
10.0.100.10 k8s-master01
10.0.100.11 k8s-node01
10.0.100.12 k8s-node02
scp /etc/hosts root@k8s-node01:/etc/hosts scp /etc/hosts root@k8s-node02:/etc/hosts
kube-proxy開啟ipvs的前置條件
kube-proxy主要解決 pod的調度方式,開啟這個條件可以增加訪問效率
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules << EOF #! /bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_contrack_ipv4
安裝Docker軟件
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum update -y && yum install -y docker-ce ## 創建/etc/docker目錄 mkdir /etc/docker # 配置daemon cat > /etc/docker/daemon.json << EOF { "exec-opts":["native.cgroupdriver=systemd"], "log-driver":"json-file", "log-opts":{ "max-size":"100m" } } EOF # 創建存放docker的配置文件 mkdir -p /etc/systemd/system/docker.service.d # 重啟docker服務 systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安裝Kubeadm(主從配置)
讓kubeadm去引導成為k8s
cat <<EOF >/etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1 # kubelet是與容器接口進行交互,而k8s通過kubeadm安裝以后都是以Pod方式存在,底層是以容器的方式運行。所以一定要開機自啟,不然的話啟動不了k8s集群 systemctl enable kubelet.service
初始化主節點
kubeadm在初始化k8s集群的時候,會從gce雲服務器pull一些所需要的鏡像,並且這個鏡像是非常大的,而且速度比較慢。
如果有xxr,可通過軟路由配置讓K8s集群機器
沒有xxr,直接拉入Kubeadm-basic.images.tar.gz,拉到k8s集群中,導入即可
vim load-images.sh,因為要導入的鏡像太多,直接用腳本。
#!/bin/bash # 默認會解壓到/root/kubeadm-basic.imageswe文件下 tar -zxvf /root/kubeadm-basic.images.tar.gz 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
接着
# 顯示默認init初始化文件打印到 yaml文件中。從而得到默認的初始化模板 kubeadm config print init-defaults > kubeadm-config.yaml vim kubeadm-config.yaml 修改為(默認的調度方式是ipvs): advertiseAddress: 10.0.100.10 kubernetesVersion: v1.15.1 添加覆蓋: networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" serviceSubnet: 10.96.0.0/12 scheduler: {} --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration featureGates: SupportIPVSProxyMode: true mode: ipvs 然后 kubeadm init --config=kubeadm-config.yaml | tee kubeadm-init.log


安裝完成后,還需要進行如下設置
在當前家目錄下創建.kube文件,這里會保存連接配置
kubectl和kubeapi交互,采取HTTPS協議,所以需要些緩存和認證文件都會保存到.kube文件
然后拷貝管理配置文件到.kube目錄下
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看當前有哪些節點,kubectl get node
為什么是NotReady狀態,因為k8s要求有一個扁平化網絡存在,還沒構建Flannel網絡插件,所以還是NotReady
部署網絡
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master01 ~]# mkdir install-k8s mv kubeadm-init.log kubeadm-config.yaml install-k8s/ cd install-k8s/ mkdir core mv * core/ mkdir plugin cd plugin mkdir flannel cd flannel/ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl create -f kube-flannel.yml 查看組件運行,發現flannel已經在運行 kubectl get pod -n kube-system 發現已經ready了 kubectl get node 原理:kubectl是命令行管理工具,get獲取pod狀態,-n是指定名稱空間為kube-system。因為所有的系統組件都被安裝在kube-system 如果不加-n指定,默認是default

加入主節點以及其余工作節點
在其余工作節點 執行主節點的安裝日志中的加入命令即可(語句在安裝的結尾處)
kubeadm join 10.0.100.10:6443 --token abcdef.0123456789abcdef
–discovery-token-ca-cert-hash sha256:fc19a598cb245d740ed58ca964a7e7e646dd19c773756f86224a966eecb6038e
kubectl get node 查看
Harbor采取私有的倉庫去鏡像使用
Centos7系統,然后安裝Docker,跟上面安裝docker一樣
安裝docker
yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum update -y && yum install -y docker-ce ## 創建/etc/docker目錄 mkdir /etc/docker # 配置daemon cat > /etc/docker/daemon.json << EOF { "exec-opts":["native.cgroupdriver=systemd"], "log-driver":"json-file", "log-opts":{ "max-size":"100m" } } EOF # 創建存放docker的配置文件 mkdir -p /etc/systemd/system/docker.service.d # 重啟docker服務 systemctl daemon-reload && systemctl restart docker && systemctl enable docker
vim /etc/docker/daemon.json
為了讓k8s集群信任這個自己制作的證書
每個節點,包括harbor都需要加這么一句話
"insecure-registries": ["https://hub.atguigu.com"]
systemctl restart docker
docker-compose
在 Linux 上的也安裝十分簡單,從 官方 GitHub Release [https://github.com/docker/compose/releases] 處直接下載編譯好的二進制文件即可。
例如,在 Linux 64 位系統上直接下載對應的二進制包。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
國內源安裝
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose

拉入docker-compose到harbor
鏈接:https://pan.baidu.com/s/1cE-1DWb_2JbOunOtS_J4-g
提取碼:rswr
mv docker-compose /usr/local/bin/ chmod a+x /usr/local/bin/docker-compose
拉入harbor安裝包
tar -zxvf harbor-offline-installer-v1.2.0.tgz mv harbor /usr/local/ cd /usr/local/harbor/ vim harbor.cfg 修改: hostname = hub.atguigu.com ui_url_protocol = https
創建https證書以及配置相關目錄
創建https證書的目錄,在harbor.cfg對應
mkdir -p /data/cert cd /data/cert # 創建私鑰密碼 openssl genrsa -des3 -out server.key 2048 # ssl請求 # 國家名 CN # 省 GD # 組織 atguigu # 域名 hub.atguigu.com # Common Name (eg, your name or your server's hostname) []:hub.atguigu.com openssl req -new -key server.key -out server.csr # 備份私鑰 cp server.key server.key.org # 轉換成證書,讓私鑰的密碼退掉,因為docker啟動時私鑰的證書有密碼,會啟動不成功 openssl rsa -in server.key.org -out server.key # 證書簽名 openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt # 證書賦予權限 chmod -R 777 /data/cert

運行install腳本
每個節點
echo "10.0.100.13 hub.atguigu.com" >> /etc/hosts harbor目錄下 ./install.sh

(1)聯網問題,修改主機名為 hub.atguigu.com
ERROR: for harbor-ui UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70) ERROR: for ui UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70) ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information. If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
解決:hostnamectl set-hostname hub.atguigu.com
直接把之前的容器和鏡像都刪除干凈,重新執行install.sh
(2)has active endpoints
ERROR: error while removing network: network harbor_harbor id 91ec97d7a1f661e4d687b7d69c3060144de77df113f0205590f07fb39843f44b has active endpoints
解決
docker network inspect harbor_harbor
//斷開網絡,這里有兩個Name參數 ,分別是上面標記的參數一和參數二
docker network disconnect -f harbor_harbor harbor-ui
//然后執行
docker-compose up -d
再次執行install.sh
(3)Timed out
ERROR: for jobservice UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60) ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information. If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
解決
解決思路:把 COMPOSE_HTTP_TIMEOUT 的值調大,並轉為環境變量即可。
解決步驟:
先進入/etc/profile配置文件,執行命令:
vi /etc/profile 然后在尾部添加上下面代碼: export COMPOSE_HTTP_TIMEOUT=500 export DOCKER_CLIENT_TIMEOUT=500 接着使/etc/profile配置文件生效,執行命令: source /etc/profile 最后重新執行命令 docker-compose up 即可。
(4)容器重新建
ERROR: for 30a708d1ccb1_harbor-ui b'You cannot remove a running container 30a708d1ccb166cb63885c4aa66e73a4b1c0e5b815185d990eb5190e16463da7. Stop the container before attempting removal or force remove' ERROR: for ui b'You cannot remove a running container 30a708d1ccb166cb63885c4aa66e73a4b1c0e5b815185d990eb5190e16463da7. Stop the container before attempting removal or force remove' ERROR: Encountered errors while bringing up the project.
解決
刪除不掉容器文件占用,其實是網絡問題。
解決辦法如下
1、docker stop 容器ID\容器名 先暫停
2、docker network disconnect --force bridge 容器ID\容器名 清除網絡
3、docker rm -f 容器ID\容器名 再強制刪除
最終成功,各種報錯,一步步終於好了!!!

W10真實主機
C:\Windows\System32\drivers\etc\hosts
10.0.100.13 hub.atguigu.com
瀏覽器訪問 hub.atguigu.com
在/usr/local/harbor/harbor.cfg文件中
默認用戶名 admin
默認密碼 Harbor12345
集群檢測
檢測k8s是否能利用到harbor倉庫,那在k8s利用之前,docker要能先利用到
1、node01上檢測docker
出現報錯可能是因為json格式
檢查 /etc/docker/daemon.json是不是如下格式
{ "exec-opts":["native.cgroupdriver=systemd"], "log-driver":"json-file", "log-opts":{ "max-size":"100m" }, "insecure-registries": ["https://hub.atguigu.com"] } 然后重啟一下docker: systemctl daemon-reload systemctl restart docker
docker login https://hub.atguigu.com
docker pull wangyanglinux/myapp:v1 在公共docker hub拉取
重新打標簽,因為推送鏡像必須要命名成hub.atguigu.com
docker tag wangyanglinux/myapp:v1 hub.atguigu.com/library/myapp:v1
docker push hub.atguigu.com/library/myapp:v1
刷新查看鏡像情況
docker images
然后刪除鏡像,為了后面驗證k8s集群是否可下載
docker rmi -f hub.atguigu.com/library/myapp:v1
docker rmi -f wangyanglinux/myapp:v1
重新打標簽,因為推送鏡像必須要命名成hub.atguigu.com
完整過程
2、測試k8s集群是否可用,與鏡像倉庫連接情況
在k8s啟動pod看是否OK
k8s-master01執行:
暴露端口80和docker的80是不一樣的,不寫也可以訪問的,因為是扁平化網絡
kubectl run nginx-deployment --image=hub.atguigu.com/library/myapp:v1 --port=80 --replicas=1 kubectl get deployment kubectl get rs kubectl get pod kubectl get pod -o wide

然后到node01查看是否有nginx的
docker ps -a | grep nginx
只要運行一個pod就會有pause
如果master想訪問node01的話,直接curl IP,因為是扁平化網絡
curl 10.244.2.2
curl 10.244.2.2/hostname.html 獲取pod名稱
這樣一來私有倉庫連接成功。減輕外網網絡資源壓力
3、harbor倉庫查看,鏡像下載次數1
集群功能演示
kubectl get pod 獲取pod
kubectl delete pod Name 刪除pod
kubectl get pod 獲取pod,發覺又多了一個,和之前名字不一樣
因為在之前kubectl run的時候已經指明了副本replicas=1,會保持為1
如果有一天壓力過大,可不可以擴容?
kubectl get pod
kubectl scale --replicas=3 deployment/nginx-deployment
kubectl get pod
kubectl get pod -o wide

nginx負載訪問,通過SVC
kubectl expose --help
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
訪問服務端的30000端口, 訪問的是容器的80端口
kubectl get svc
curl訪問測試,是一個輪詢的機制
ipvsadm -Ln | grep 10.105.236.174
kubectl get pod -pod -o wide
發現SVC機制就是調度LVS模塊實現負載均衡,這個是內部地址。
如果外部想訪問怎么辦?修改類型
kubectl get svc
kubectl edit svc nginx-deployment
type: NodePort
kubectl get svc
netstat -anpt | grep 30000
netstat -anpt | grep 32651
在所有的節點都暴露這么一個端口,然后瀏覽器直接訪問32651端口即可
10.0.100.10:32651
10.0.100.11:32651
10.0.100.12:32651
這樣一來,改成NodePort類型,就可以在web訪問到k8s內部的服務。

終於大功告成!!!!!!!!!!
轉載於:https://blog.csdn.net/qq_39578545/article/details/108861006

