本文中所有帶引號的命令,請手動輸入引號,不知道爲什麼博客裏輸入引號,總是自動轉換成了中文
基本組成
- pod:k8s 最小單位,類似docker的容器(也許)
- 資源清單:資源、資源清單語法、pod生命週期
- 調度器:將容器分配到對應pod的功能組件(描述應該沒錯吧)
- 服務發現:通過暴露地址和端口,讓客戶端訪問
- 存儲組成:
- configMap:配置文件
- secret:安全相關
- volume:數據
- 安全體系:集羣認證、體系、訪問控制
- HELM :貌似包含了一些集羣一鍵部署的命令
- 證書:k8s許可只有一年
K8S結構:
- master:
- 調度器(schduler--api server--etcd):控制任務
- replication controller:控制副本數量
- 客戶端kubectl、brower
- Pod:kublet、kubproxy、docker(或其他容器)
- ETCD:分佈式鍵值數據庫
內存 v2版本,
硬盤 v3版本 - PV動態創建
- 備份機制
重要組件
- APISERVER :所有程序訪問的統一入口
- ControllerManager:維持副本期望數目
- Scheduler:負責介紹任務,選擇合適節點進行任務分配
- ETCD:鍵值對數據庫 存儲k8s集羣所有的重要信息
- Kublet: 直接跟容器引擎交互實現容器的生命週期管理
- Kube-proxy:負責把規則寫入IPABLES、IPVS實現服務映射訪問的
- CORENDS:爲集羣中的SVC 創建一個域名IP的對應關係解析
- DASHBOARD: 給K8S集羣提供一個 B/S 結構訪問體系
- INGRESS CONTROLLER(第三方): INGRESS 實現7層代理
- FEDERATION: 提供一個可以跨集羣中心多K8S統一管理功能
- PROMETHEUS: 提供K8S集羣的監控能力
- ELK : 提供K8S 集羣日誌統一分析平臺
Pod
- POD(可以理解爲):自主式POD和控制器管理的POD
- POD內的端口不能有衝突
- POD內網絡公用、磁盤公用
控制器
-
ReplicationController: 保證節點數量
-
ReplicaSet: 支持打標籤,易於管理
-
Deployment:支持滾動更新
-
HPA :彈性伸縮
-
無狀態服務:nginx、tomcat等
-
有狀態服務:mysql、mongoDB等
-
StateFulset:解決有狀態服務的問題
- 穩定持久化存儲
- 穩定網絡標誌(podName和HostName)
- 有序部署:保證pod按照一定順序部署
- 有序回收:保證pod按照一定順序刪除
-
DaemonSet: 確保全部或部分node上運行一個Pod副本!
自我理解爲當新加一個node後,爲該node分配一個Pod副本,
如果當前node有Pod,則當前node上的Pod在其他node上也會分配Pod副本! -
job:處理批處理任務,可判斷程序是否正常退出(類似java的事務吧???)
服務發現
客戶端通過Service的IP:port訪問service上的服務。
service則通過標籤及一定算法來連接Pod。
Kubernetes 網絡
- 特點:扁平化網絡
- Pod通訊:
- Pod內容器通過pause
- Pod間可以通過:Overlay 網絡模式
- Pod與Service:各個node的iptables規則(防火牆協議)\ LVS
- flannel網絡服務:爲k8s創建一個overlay網絡。
- overlay網絡:爲每一個容器在集羣中分配一個虛擬IP,不同節點的容器之間通過虛擬IP通信!
k8s安裝
-
關閉防火牆:
systemctl stop firewalld
systemctl disable firewalld
-
關閉selinux:
(博客文檔格式可能有問題,如果出問題,則嘗試手敲該命令)
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
-
關閉swap:(雲主機貌似默認關了)
swapoff -a
-
設置主機名
hostnamectl set-hostname master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
-
設置host綁定關係(這裏有個坑,公網IP貌似kubeadm init時會報錯【需要開相關端口】,
(內網IP則OK)
公網:
cat >> /etc/hosts << EOF
121.36.162.228 k8s-master
119.3.29.205 k8s-node1
121.36.131.14 k8s-node2
EOF
內網:
cat >> /etc/hosts << EOF
192.168.0.179 k8s-master
192.168.0.25 k8s-node1
192.168.0.93 k8s-node2
EOF
-
設置流量轉發(官網建議):
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
執行生效:
sysctl --system
-
安裝docker:
配置阿里雲源:
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安裝docker(最好是18及以上版本,否則可能會...):
yum -y install docker-ce-18.06.1.ce-3.el7
設置開機啓動:
systemctl enable docker && systemctl start docker
檢查安裝:
docker --version
*版本18即安裝成功
(XSHELL 工具--發送輸入到所有會話)
-
安裝一些依賴:
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
-
同步時間:
ntpdate time.windows.com
-
配置阿里雲鏡像加速器:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vkayqpp3.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
-
添加阿里雲yum源(注意:gpgkey有兩個值)
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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 clean all
yum -y makecache
-
安裝kubeadm,kubelet和kubectl
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
設置開機啓動:
systemctl enable kubelet
(XSHELL 工具--發送輸入到所有會話 先關閉這個功能)
-
【公網】在master節點執行初始化(master地址:121.36.162.228):
kubeadm init \
--apiserver-advertise-address=121.36.162.228 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
-
【內網】
kubeadm init \
--apiserver-advertise-address=192.168.0.179 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
-
複製命令,設置kubectl 連接:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
初始化生成的token 要先記錄一下:
稍後在其他終端複製命令,讓其加入:
kubeadm join 192.168.0.179:6443 --token gytw5j.s17r2eztwxobwbs4 \ --discovery-token-ca-cert-hash sha256:f5062698588983af4aad********1006eb13d9f
-
安裝flannel網絡:
- 執行:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 失敗可能性極高:所以通過網址手動下載kube-flannel.yml文件 - 修改下圖對應位置,找一個能下載的鏡像修改一下,
再執行 kubectl apply -f kube-flannel.yml
- 執行:
-
查看master狀態 :
kubectl get pods -n kube-system
如果全部爲running,那就說明master基本已經安裝OK! -
節點加入
在其他終端複製命令,讓其加入:
下面的token未kubeadm init 執行時生成的,可以在終端找一下
'kubeadm join 192.168.0.179:6443 --token gytw5j.s17r2eztwxobwbs4
--discovery-token-ca-cert-hash sha256:f5062698588983af4aad********1006eb13d9f' -
測試一下,查看默認pod:
'kubectl get pods -n kube-system'
'kubectl get nodes -n kube-system' -
補充:
docker pull 被可愛的人擋住了
也可以官網安裝:https://github.com/coreos/flannel