Kubernetes(K8s)-k8s服務集群安裝
一、環境準備
1、機器環境
節點CPU核數必須是 :>= 2核 ,否則k8s無法啟動
DNS網絡: 最好設置為 本地網絡連通的DNS,否則網絡不通,無法下載一些鏡像
linux內核: linux內核必須是 4 版本以上,因此必須把linux核心進行升級
準備3臺虛擬機環境,或者是3臺阿里云服務器都可。
k8s-master01:? 此機器用來安裝k8s-master的操作環境
k8s-node01: 此機器用來安裝k8s node節點的環境
k8s-node02: 此機器用來安裝k8s node節點的環境
2、依賴環境
#1、給每一臺機器設置主機名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
#查看主機名
hostname
#配置IP host映射關系
vi/etc/hosts
192.168.66.10 k8s-master01
192.168.66.11 k8s-node01
192.168.66.12 k8s-node02
?
202.106.0.20
?
#2、安裝依賴環境,注意:每一臺機器都需要安裝此依賴環境
yum install-yconntrack ntpdate ntp ipvsadm ipset jq iptablescurlsysstat libseccompwgetvimnet-toolsgitiproute lrzsz bash-completion tree bridge-utils unzip bind-utilsgcc
?
#3、安裝iptables,啟動iptables,設置開機自啟,清空iptables規則,保存當前規則到默認規則
# 關閉防火墻
systemctlstopfirewalld && systemctl disable firewalld
# 置空iptables
yum-yinstall iptables-services && systemctlstartiptables && systemctl enable iptables && iptables-F&&serviceiptables save
?
#4、關閉selinux
?
#閉swap分區【虛擬內存】并且永久關閉虛擬內存
swapoff-a&&sed-i'/ swap / s/^\(.*\)$/#\1/g'/etc/fstab
#關閉selinux
setenforce0&&sed-i's/^SELINUX=.*/SELINUX=disabled/'/etc/selinux/config
?
?
#5、升級Linux內核為4.44版本
rpm-Uvhhttp://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
#安裝內核
yum--enablerepo=elrepo-kernel install-ykernel-lt
#設置開機從新內核啟動
grub2-set-default'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
#注意:設置完內核后,需要重啟服務器才會生效。
#查詢內核
uname-r
?
#########################################################################
?
#6、調整內核參數,對于k8s
cat> kubernetes.conf <
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.nf_conntrack_max=2310720
EOF
?
#將優化內核文件拷貝到/etc/sysctl.d/文件夾下,這樣優化文件開機的時候能夠被調用
cpkubernetes.conf /etc/sysctl.d/kubernetes.conf
#手動刷新,讓優化文件立即生效
sysctl-p/etc/sysctl.d/kubernetes.conf
?
?
#7、調整系統臨時區 --- 如果已經設置時區,可略過
#設置系統時區為中國/上海
timedatectl set-timezone Asia/Shanghai
#將當前的 UTC 時間寫入硬件時鐘
timedatectl set-local-rtc0
#重啟依賴于系統時間的服務
systemctlrestartrsyslog
systemctlrestartcrond
?
#7、關閉系統不需要的服務
systemctlstoppostfix && systemctl disable postfix
?
?
#8、設置日志保存方式
#1).創建保存日志的目錄
mkdir/var/log/journal
#2).創建配置文件存放目錄
mkdir/etc/systemd/journald.conf.d
#3).創建配置文件
cat> /etc/systemd/journald.conf.d/99-prophet.conf <
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF
?
#4).重啟systemd journald的配置
systemctlrestartsystemd-journald
?
#9、打開文件數調整 (可忽略,不執行)
echo"* soft nofile 65536">> /etc/security/limits.conf
echo"* hard nofile 65536">> /etc/security/limits.conf
?
#10、kube-proxy 開啟 ipvs 前置條件
modprobe br_netfilter
cat> /etc/sysconfig/modules/ipvs.modules <
#!/bin/bash
modprobe--ip_vs
modprobe--ip_vs_rr
modprobe--ip_vs_wrr
modprobe--ip_vs_sh
modprobe--nf_conntrack_ipv4
EOF
##使用lsmod命令查看這些文件是否被引導
chmod755/etc/sysconfig/modules/ipvs.modules &&bash/etc/sysconfig/modules/ipvs.modules && lsmod |grep-eip_vs-enf_conntrack_ipv4
?
3、docker部署
#1、安裝docker
yum install-yyum-utils device-mapper-persistent-data lvm2
?
#緊接著配置一個穩定(stable)的倉庫、倉庫配置會保存到/etc/yum.repos.d/docker-ce.repo文件中
yum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repo
?
#更新Yum安裝的相關Docke軟件包&安裝Docker CE
yum update-y&& yum install docker-ce
?
#2、設置docker daemon文件
#創建/etc/docker目錄
mkdir/etc/docker
#更新daemon.json文件
cat> /etc/docker/daemon.json <
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver":"json-file","log-opts": {"max-size":"100m"}}
EOF
#注意: 一定注意編碼問題,出現錯誤:查看命令:journalctl -amu? docker 即可發現錯誤
?
#創建,存儲docker配置文件
mkdir-p/etc/systemd/system/docker.service.d
?
#3、重啟docker服務
systemctl daemon-reload && systemctlrestartdocker && systemctl enable docker
4、kubeadm
#1、安裝kubernetes的時候,需要安裝kubelet, kubeadm等包,但k8s官網給的yum源是packages.cloud.google.com,國內訪問不了,此時我們可以使用阿里云的yum倉庫鏡像。
cat< /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
?
#2、安裝kubeadm、kubelet、kubectl
yum install-ykubeadm-1.15.1 kubelet-1.15.1 kubectl-1.15.1
# 啟動 kubelet
systemctl enable kubelet && systemctlstartkubelet
?
二、集群安裝
1、依賴鏡像
上傳鏡像壓縮包,把壓縮包中的鏡像導入到本地鏡像倉庫
編寫腳本問題,導入鏡像包到本地docker鏡像倉庫:
# kubeadm 初始化k8s集群的時候,會從gce Google云中下載(pull)相應的鏡像,且鏡像相對比較大,下載比較慢,且需要解決科學上網的一個問題,國內上goole,懂得...........
?
#1、導入鏡像腳本代碼? (在任意目錄下創建sh腳本文件:image-load.sh)
#!/bin/bash
#注意 鏡像解壓的目錄位置
ls/root/kubeadm-basic.images > /tmp/images-list.txt
cd/root/kubeadm-basic.images
foriin$(cat /tmp/images-list.txt)
do
docker load-i$i
done
rm-rf/tmp/images-list.txt
?
#2、修改權限,可執行權限
chmod755image-load.sh
?
#3、開始執行,鏡像導入
./image-load.sh
?
#4、傳輸文件及鏡像到其他node節點
#拷貝到node01節點
scp-rimage-load.sh kubeadm-basic.images root@k8s-node01:/root/
#拷貝到node02節點
scp-rimage-load.sh kubeadm-basic.images root@k8s-node02:/root/
?
#其他節點依次執行sh腳本,導入鏡像
導入成功后鏡像倉庫如下圖所示:
2、k8s部署
#初始化主節點 --- 只需要在主節點執行
?
#1、拉去yaml資源配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
?
#2、修改yaml資源文件
? ? localAPIEndpoint:
? ? advertiseAddress:192.168.66.10# 注意:修改配置文件的IP地址
? ? kubernetesVersion: v1.15.1#注意:修改版本號,必須和kubectl版本保持一致
? ? networking:
? ? # 指定flannel模型通信 pod網段地址,此網段和flannel網段一致
? ? podSubnet:"10.244.0.0/16"
? ? serviceSubnet:"10.96.0.0/12"
? ? #指定使用ipvs網絡進行通信
? ? ---
? ? apiVersion: kubeproxy.config.k8s.io/v1alpha1
? ? kind: kubeProxyConfiguration
? ? featureGates:
? ? SupportIPVSProxyMode:true
? ? mode: ipvs
?
#3、初始化主節點,開始部署
kubeadm init--config=kubeadm-config.yaml--experimental-upload-certs|teekubeadm-init.log
#注意:執行此命令,CPU核心數量必須大于1核,否則無法執行成功
?
kubernetes主節點初始化成功后,如下所示:
按照k8s指示,執行下面的命令:
?
#4、初始化成功后執行如下命令
#創建目錄,保存連接配置緩存,認證文件
mkdir-p$HOME/.kube
#拷貝集群管理配置文件
cp-i/etc/kubernetes/admin.conf$HOME/.kube/config
#授權給配置文件
chown$(id -u):$(id -g)$HOME/.kube/config
?
執行命令前查詢node:
執行命令后查詢node:
我們發現已經可以成功查詢node節點信息了,但是節點的狀態卻是NotReady,不是Runing的狀態。原因是此時我們使用ipvs+flannel的方式進行網絡通信,但是flannel網絡插件還沒有部署,因此節點狀態此時為NotReady
3、flannel插件
#部署flannel網絡插件 --- 只需要在主節點執行
#1、下載flannel網絡插件
wgethttps://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
?
#2、部署flannel
kubectl create-fkube-flannel.yml
?
#也可進行部署網絡
kubectl apply-fhttps://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
部署完畢查詢pod,發現一些異常錯誤現象:
發現通過flannel部署的pod都出現pending,ImagePullBackOff這樣的問題:
查詢日志信息,發現了一些錯誤:
#查詢一個pod的詳細信息
kubectl describe pod kube-flannel-ds-amd64-jd67h-nkube-system
kubectl apply-fkube-flannel.yml#服務已正常啟動
?
部署flannel網絡插件時候,注意網絡連通的問題:
4、節點Join
構建kubernetes主節點成功,會產生一個日志文件(命令中指定日志輸出文件 “tee kubeadm-init.log”),內容如下所示:
紅色 部分給出的命令即是把其他節點加入進來的命令。
# 加入主節點以及其余工作節點,執行安裝日志中的命令即可
#查看日志文件
cat kubeadm-init.log
# 負責命令到其他幾個node節點進行執行即可
kubeadm join 192.168.66.10:6443 --token abcdef.0123456789abcdef \
? ? --discovery-token-ca-cert-hash sha256:6d8aad1451c1303ee52aada4ea2351e8c8d64863b074628586535d0d369ca2c2
執行完畢,查看效果如下所示:
發現還有一些節點處于NotReady狀態,是因為這些節點pod容器還處于初始化的狀態,需要等一點時間:
更詳細查看命令,可以看見初始化節點所屬節點:
# 查詢工作空間中pod容器的詳細信息
kubectl get pod -n kube-system -o wide
5、私有倉庫
#私有倉庫搭建 harbor
# 偽造證書
"insecure-registries": ["https://hub.kaikeba.com"]
# 把證書添加/etc/docker/daemon.json文件中,其的每一個節點都做如下模式添加:偽造證書
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.kaikeba.com"]}
# node01 添加 "insecure-registries": ["https://hub.kaikeba.com"]
# node02 添加 "insecure-registries": ["https://hub.kaikeba.com"]
# 偽造證書
vi /etc/docker/daemon.json
#更詳細教程,參考私有倉庫構建md文檔
6、案例實戰