目錄
- Docker
- 利用Dockerfile制作容器鏡像
- Kubernetes
- k8s安裝簡介
- k8s必備概念
- k8s整體架構(gòu)
- Service、RC(Deployment)、Pod對象如何構(gòu)成完整的服務(wù)
- Pod,RC(Deployment)、Pod對象如何編寫構(gòu)建
- Pod通信問題
Docker
Dockerfile制作容器鏡像
-
常用語法
語法 描述 FROM <IMAGE> 鏡像制作的基鏡像,必須為第一個命令 MAINTAINER 維護(hù)者信息 RUN <SHELL COMMAND> 用于在鏡像容器中執(zhí)行命令 ADD <src> <dest> 將本地文件添加到容器中,tar類型文件會自動壓,可訪問網(wǎng)絡(luò)文件 COPY <src> <dest> 將本地文件添加到容器中,但不會自動解壓文件,也不能訪問網(wǎng)絡(luò)文件 CMD ["","",...] 容器運(yùn)行時運(yùn)行的命令 ENV<key>=<value> ... 給容器設(shè)置環(huán)境變量 EXPOSE <PORT> 指定于外界交互的端口 VOLUME <Directory> 用于指定持久化目錄 user <USER>:<GROUP> 指定運(yùn)行容器時的用戶,組 示例 mycat鏡像制作
cat Dockerfile
FROM longhronshens/mycat-docker
EXPOSE 8066
EXPOSE 9066
COPY log4j2.xml /usr/local/conf/
COPY schema.xml /usr/local/conf/
COPY server.xml /usr/local/conf/
RUN chmod -R 777 /usr/local/mycat/bin
CMD ["./usr/local/mycat/bin/mycat","console"]
kubernetes
k8s安裝簡介
- 每個節(jié)點操作
1、安裝docke-ce http://172.16.1.134:4999/web/#/1?page_id=5 2、環(huán)境準(zhǔn)備 - 打開內(nèi)置的橋功能 sudo echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables - 禁止swap sudo swapoff -a - 關(guān)閉防火墻 sudo systemctl stop 3、添加k8s yum 源 vim /etc/yum.repos.d/kubernets.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 4、安裝kubeadm,kubelet,kebectl sudo yum install -y kubelet-1.14.1 kubeadm-1.14.1 kubectl-1.14.1 5、啟動kubelet sudo systemctl enable kubelet #設(shè)置開機(jī)啟動 systemctl start kubelet #啟動服務(wù) 6、添加主機(jī)解析 vim /etc/hosts 172.16.0.109 master 172.16.0.110 node01 172.16.0.111 node02 - master上操作
1、初始化master節(jié)點 kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.14.1 --apiserver-advertise-address 172.16.0.109 --pod-network-cidr=10.244.0.0/16 #--image-repository:指定拉取鏡像地址 #--kubernetes-version string 指定kubenetes版本號,最好與kubeadm,kubelet,kebectl一致 #--apiserver-advertise-address 指明用master哪個接口與集群的其他節(jié)點通信 #--pod-network-cidr:指定Pod網(wǎng)絡(luò)的范圍,flannel網(wǎng)絡(luò)方案.其他網(wǎng)絡(luò)模型calico。 2、配置kubectl mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"} - 添加node節(jié)點
- 主節(jié)點操作,獲取token值與ca 證書的 hash 值 - 獲取master init 產(chǎn)生的token值:kubeadm token lis - 獲取ca證書的 hash 值:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' - 各節(jié)點操作 kubeadm join 172.16.0.109:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903 重啟從節(jié)點kubelet服務(wù):sudo systemctl restart kubelet
dash-board安裝
- 安裝(http)
1、下載kubernets-dashboard.ymal文件
cd /data/kubernets-dashboard
wget http://pencil-file.oss-cn-hangzhou.aliyuncs.com/blog/kubernetes-dashboard.yaml
2、修改kubernet-dashboard.ymal中的鏡像源地址和port類型
--修改鏡像源
vim kubernet-dashboard.ymal匹配image將其改為
registry.cn-hangzhou.aliyuncs.com/lynchj/kubernetes-dashboard-amd64:v1.10.1 //版本可根據(jù)實際去選擇
--匹配Service,將文件中
type: service 修改為
type: NodePort
若無此項直接添加
如下:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
3、創(chuàng)建kubernet-dashboard pod
kubectl apply -f kubernetes-dashboard.yaml //創(chuàng)建
kubectl get pods --namespace=kube-system //NAME下有kubernet-dashboard
4、查看暴露的端口(后面網(wǎng)頁訪問的端口)
kubectl get service --namespace=kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 46h
kubernetes-dashboard NodePort 10.98.13.93 <none> 443:30313/TCP 51m
//NodePort端口
5、創(chuàng)建kubenerts-dash admin 賬號
vim admin-token.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcil
創(chuàng)建用戶:
kubectl create -f admin-token.yaml
6、獲取對應(yīng)用戶的token
kubectl get secret -n kube-system |grep admin|awk '{print $1}'
輸出結(jié)果:admin-token-f5q68
kubectl describe secret admin-token-f5q68 -n kube-system|grep '^token'|awk '{print $2}'
輸出結(jié)果: admin 賬號登錄的token
7、登錄
https://172.16.0.109:30313
- 使用
k8s 必備的概念
- Node
- Pod
k8s的最基本的操作單元,包含一個或多個緊密相關(guān)的容器,容器中容器共享一組資源:
- PID命名空間
- 網(wǎng)絡(luò)命名空間
- IPC命名空間(Inter-Process Communication)
- UTS命令空間(UNIX Time-sharing System namespace)
- 共享存儲卷
- Label
- RC(Replication Controller): 用于定義Pod
- Deployment 無狀態(tài)應(yīng)用Pod定義;StatefulSet有狀態(tài)應(yīng)用
- 有狀態(tài)應(yīng)用(Session):Web請求端的請求必須被提交到保存有其相關(guān)狀態(tài)信息(比如session)的服務(wù)器上,否則這些請求可能無法被理解,這也就意味著在此模式下服務(wù)器端無法對用戶請求進(jìn)行自由調(diào)度
- 無狀態(tài)應(yīng)用(JWT)::任意一個Web請求端提出請求時,請求本身包含了響應(yīng)端為響應(yīng)這一請求所需的全部信息(認(rèn)證信息等)
簡單理解:狀態(tài)(公共交互)信息是由請求方還是響應(yīng)方負(fù)責(zé)保存,請求方保存就是無狀態(tài),響應(yīng)方保存就是有狀態(tài)。
- 適用場景:
有狀態(tài)應(yīng)用:
穩(wěn)定的持久化存儲 :Pod重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù)
穩(wěn)定的網(wǎng)絡(luò)標(biāo)志 :Pod重新調(diào)度后PodName和HostName不變
有序部署 :Pod是有順序的,在部署或者擴(kuò)展的時候要依據(jù)定義的順序依次進(jìn)行操作
有序收縮
- Service
理解:一組提供相同服務(wù)的Pod的對外訪問接口
理解3個IP:
NodeIP:NodeIP是kubernetes中每個節(jié)點的物理網(wǎng)卡IP地址,是一個真實存在的物理網(wǎng)絡(luò),所有屬于這個網(wǎng)絡(luò)的服務(wù)器都能通過這個網(wǎng)絡(luò)直接通訊,包括集群外的主機(jī)訪問集群內(nèi)的主機(jī)也需要NodeIP
PodIP:PodIP是每個Pod地址,它是docker engine根據(jù)docker0網(wǎng)橋的IP地址進(jìn)行分配的,通常是一個虛擬的二層網(wǎng)絡(luò),所以kubernetes里的一個Pod里的容器訪問另外一個Pod里的容器時,就是通過PodIP所在的虛擬二層網(wǎng)絡(luò)進(jìn)行通訊的,而真實的TCP/IP流量是通過NodeIP所在的物理網(wǎng)卡流出的
ClusterIP只能結(jié)合service Port組成一個具體的通訊端口
- Volume p49
- Namespace
理解:邏輯對象分組
- Annotation注釋
- etcd
- API Server
- Controller Manager
- Scheduler
- kubelet
- Proxy
k8s整體架構(gòu)

k8s架構(gòu)圖ww
- master
etcd: 高可用的key/value存儲系統(tǒng),用于持久化存儲集群中所有的資源對象 API Server提供了操作etcd的封裝接口API,以REST方式提供服務(wù),API Server是連接其他所有服 務(wù)組件的樞紐。提供了資源對象的象的唯一操作入口,其他所有組件必須通過它提供的API來操作資源數(shù)據(jù),通過對相關(guān)的資源數(shù)據(jù)“全量查詢”+“變化監(jiān)聽”,這些組件可以很實時地完成相關(guān)的業(yè) 務(wù)功能 Controller Manager:集群內(nèi)部的管理控制中心,其主要目的是事先k8s集群的故障檢測和回復(fù)的自 動化工作,如RC的定義完成pod的復(fù)制或移除;根據(jù)Service與Pod的管理關(guān)系,完成服務(wù)的 Endpoint是對象的創(chuàng)建和更新,如node發(fā)現(xiàn)、管理、監(jiān)控,死亡容器所占磁盤空間及本地緩存的 鏡像文件清理等工作。 Scheduler:集群中的調(diào)度器,負(fù)責(zé)Pod在集群節(jié)點中的調(diào)度分配。 - node
kubelet: 負(fù)責(zé)本node節(jié)點上的Pod的創(chuàng)建、修改、監(jiān)控、刪除等全生命周期管理,同時kubelet同時上報kubelet定時上報本node的狀態(tài)信息到API Server。 Proxy: 實現(xiàn)Service的代理及軟件模式的負(fù)載均衡器 -
k8s各個組件之間的交互關(guān)系:以RC為例
service與pod,rc關(guān)系ww
Service、RC(Deployment)、Pod對象如何構(gòu)成完整的服務(wù)

組件交互關(guān)系ww
Pod,RC(Deployment)、Service對象如何編寫構(gòu)建 --詳見對象編寫篇
yml語法
https://blog.csdn.net/wokankanhao88/article/details/97948476Pod
RC
Deployment
https://www.cnblogs.com/ling-yu-amen/p/10956470.htmlService
namespace
spec.limits[].cpu & spec.limits[].memory 限制cpu,mem大小
Pod通信問題
-
Pod內(nèi)容器之間的通信問題
- 共享卷:操作方式-將共同讀、寫文件“映射”至宿主機(jī)共同目錄下。 - 進(jìn)程間通信(IPC):同Pod下多容器共享同一個IPC命名空間,意味著他們也可以互相使用標(biāo)準(zhǔn)進(jìn)程間通信,如SystemV信號系統(tǒng)或POSIX共享內(nèi)存 - 容器間網(wǎng)絡(luò)通信(UTS):同Pod下多容器共享同一個UTS命名空間,多容器之間可利用localhost:。 -
Pod與Pod間通信:均可使用PodIp:Port形式配置使用
- 兩個Pod在同一node上
docker默認(rèn)的docker網(wǎng)橋互連容器- 兩Pod分布在不同node上;配置PodIp:Port形式
- 官方推薦fannel組建一個大二層扁平網(wǎng)絡(luò),pod的ip分配由flannel統(tǒng)一分配,通信過程走flannel網(wǎng)橋。每個node 上會創(chuàng)建一個flannel虛擬網(wǎng)卡,用于跨node之間通訊。所以容器直接可以直接使用pod id進(jìn)行通訊。 - 一種方式,為每個Pod創(chuàng)建Service提供服務(wù)。 -
Pod中容器與集群外服務(wù)通信 -- 存在疑慮,待一起討論學(xué)習(xí)
為需要與外部服務(wù)通信的Pod創(chuàng)建Service,但不帶標(biāo)簽選擇器,進(jìn)行手動創(chuàng)建連接的后端服務(wù)(集群外服務(wù)) --與Service同名- Endpoint 方法適合外部服務(wù)是IP的情況
apiVersion: v1 kind: Service metadata: name: mysql-production spec: ports: - port: 3306 --- kind: Endpoints apiVersion: v1 metadata: name: mysql-production namespace: default subsets: - addresses: - ip: 192.168.1.25 ports: - port: 3306- tpye:ExternalName
kind: Service apiVersion: v1 metadata: name: svc1 namespace: default spec: type: ExternalName externalName: somedomain.org -
kubectl 常用管理語法
描述 語法 查看資源信息 kubectl get pods|services|namespaces|nodes|[--all-namespaces|-n NAMESPACE_NAME] 查看資源具體信息 kubectl describe pods|services|namespaces|nodes 獲取指定pod容器日志信息 kubectl logs POD_NAME CON_NAME -n NAMESPACE_NAME 創(chuàng)建/刪除資源對象 kubectl create|apply/delete -f /PATH/TO/YMLFILE [--validate] 查詢集群信息/日志信息 kubectl cluster-info [dump] 獲取pod運(yùn)行在那個節(jié)點 kubectl get pods --all-namespaces -o wide
