VR 音遊《Synth Riders》宣佈將登陸 PS VR:7 月 27 日釋出
阿新 • • 發佈:2021-07-04
目錄
- 結構
- 部署專案步驟
- 運維工具
- 部署k8s準備工作
- Kubelet、Kubeadm、Kubectl
- 命令
- 建立控制器deployment
- 暴露埠
- k8s叢集中部署nginx
- k8s叢集部署微服務
- 通過dockerfile構建映象
- 執行映象
- 空執行測試
- k8s拉取本地映象引數配置
- 命令部署
- yaml檔案方式部署
- 暴露應用的三種方式NodePort、LoadBalancer 和 Ingress
- 新增副本數,快速擴容
結構
master:k8s主機器(也可以多個master) node:k8s叢集機器 master控制node-->service(服務)-->deployment(控制器)-->pod-->docker-->部署應用
部署專案步驟
1.專案本身打包成jar或者war包,可以通過工具 2.製作專案映象(寫dockerfile檔案) 3.用k8s部署映象(命令方式或者yaml檔案方式) 4.對外暴露服務(3中方式,線上用ingress方式) 製作映象:docker build -t 映象名字 -f dockerfile路徑 . 生成yaml檔案:kubectl create deployment 控制器取名 --image=映象名 --dry-run -o yaml>./檔名.yaml 修改yaml檔案拉取本地映象:imagePullPolicy: Never 應用yaml檔案:kubectl apply -f 部署檔案.yaml 檢視是否啟動:kubectl get pods 暴露埠(給外部訪問):kubectl expose deployment nginx --port=80 --type=NodePort
運維工具
運維工具:
Ansible
Docker
docker compose ---面向一臺
docker swarm ---面向docker叢集
docker machine ---加入docker swarm的成員
DevOps
部署k8s準備工作
# 關閉防火牆 systemctl stop firewalld systemctl disable firewalld # 關閉selinux sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 setenforce 0 # 臨時 # 關閉swap(k8s禁止虛擬記憶體,提高效能) swapoff -a # 臨時 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 # 在master新增hosts cat >> /etc/hosts << EOF 192.168.1.1 k8smaster 192.168.1.2 k8snode EOF # 設定網橋引數 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 時間同步,多臺伺服器時間同步 yum install ntpdate -y ntpdate time.windows.com
Kubelet、Kubeadm、Kubectl
安裝Kubelet、Kubeadm、Kubectl
Kubelet:執行在cluster所有節點上,負責啟動POD和容器
Kubeadm:用於初始化cluster
Kubectl:Kubectl是Kubenetes命令列工具,通過Kubectl可以部署和管理應用,檢視各種資源,建立,刪除和更新組建
命令
kubectl get nodes # 查詢有哪些節點
kubectl get pods -n kube-system # 列出pods下的資源
kubectl get namespace # 名稱空間 簡寫:kubectl get ns
kubectl get deployment # 查控制器
kubectl get pod # 查pod
docker images # 查映象
docker ps # 查容器
kubectl get service # 查叢集服務
kubectl describe pods pod名稱 # 檢視pod詳情事件
kubectl logs -f pod名稱 # 不斷輸出日誌
kubectl apply -f 配置檔名.yaml # 應用配置檔案
建立控制器deployment
# 拉取映象建立容器並啟動,名為nginx
kubectl create deployment nginx --image=nginx
暴露埠
# 暴露nginx埠,給外部訪問
kubectl expose deployment nginx --port=80 --type=NodePort
k8s叢集中部署nginx
# 拉取映象建立容器並啟動,名為nginx
kubectl create deployment nginx --image=nginx
# 暴露nginx埠,給外部訪問
kubectl expose deployment nginx --port=80 --type=NodePort
k8s叢集部署微服務
1.專案打包(jar,war)-->採用工具打包,maven,jenkins
2.製作Dockerfile檔案,生成映象
3.kubectl create deployment 名字 --image=你的映象名字
4.你的springboot就部署好了,是以docker容器的方式執行在pod裡面
通過dockerfile構建映象
-f :指定要使用的Dockerfile路徑;
-t :映象的名字以及標籤
. :構建映象在當前目錄
docker build -t 映象名字 -f dockerfile路徑 .
執行映象
docker run -d 映象id
空執行測試
# 生成yaml拷貝出來改改
kubectl create deployment 控制器取名 --image=映象名 --dry-run -o yaml>./deploy.yaml
eg:
kubectl create deployment nginx3 --image=nginx --dry-run -o yaml > ./deploy.yaml
deploy.yaml內容:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx3
name: nginx3
spec:
replicas: 1
selector:
matchLabels:
app: nginx3
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx3
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
k8s拉取本地映象引數配置
containers:
- name: myweb
image: myweb-image
imagePullPolicy: Never
命令部署
kubectl create deployment 控制器取名 --image=映象名
yaml檔案方式部署
部署檔案.yaml:資源清單
kubectl apply -f 部署檔案.yaml
等價於
kubectl create deployment 控制器取名 --image=映象名
暴露應用的三種方式NodePort、LoadBalancer 和 Ingress
# 暴露nginx埠,給外部訪問
kubectl expose deployment nginx --port=80 --type=NodePort
NodePort方式
NodePort服務是讓外部請求直接訪問服務的最原始方式,NodePort是在所有的節點上開放指定的埠,所有傳送到這個埠的請求都會直接轉發到服務中的pod裡;
這種方式不足:
1.一個埠只提供一個服務使用
2.只能使用30000-32767之間的埠
3.如果節點/虛擬機器的IP地址傳送變化,需要人工處理;
所以在生產環境,不推薦這種方式釋出服務
web瀏覽器訪問:
比如一個web應用需要被其他使用者訪問,那麼需要配置type=NodePort,而且怕誒之nodePort=30001,那麼其他機器就可以通過柳萋萋訪問:scheme://node:30001訪問到該服務。
NodePort 服務的 YAML 檔案類似如下:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
selector:
app: my-app
spec:
type: NodePort # type配置
ports:
- name: http
port: 80 # 叢集各個內部訪問埠
targetPort: 80 # 容器內部埠
nodePort: 30036 # 外部暴露埠,可以指定
protocol: TCP
命令
kubectl expose deployment mysql --port=3306 --target-port=3306 --type=NodePort # 產生30000以上的隨機埠
kubectl create deployment mysql --image=mysql --dry-run -o yaml > ./deploy.yaml # 測試啟動,產生yaml檔案
LoadBalancer方式
LoadBalancer可以暴露服務,這種方式需要向雲平臺申請負載均衡器
LoadBalancer 服務是暴露服務到 internet 的標準方式。在 GKE 上,這種方式會啟動一個 Network Load Balancer,它將給你一個單獨的 IP 地址,轉發所有流量到你的服務。
何時使用這種方式?
如果你想要直接暴露服務,這就是預設方式。所有通往你指定的埠的流量都會被轉發到對應的服務。它沒有過濾條件,沒有路由等。這意味著你幾乎可以傳送任何種類的流量到該服務,像 HTTP,TCP,UDP,Websocket,gRPC 或其它任意種類
缺點:
每一個用 LoadBalancer 暴露的服務都會有它自己的 IP 地址,每個用到的 LoadBalancer 都需要付費,這將會產生成本。
Ingress方式
Ingress不是k8s內建的(安裝好k8s之後,並沒有安裝ingress),需要單獨安裝,而且有多種型別。我們一般選擇官方維護的ingress Nginx;
有別於以上所有例子,Ingress 事實上不是一種服務型別。相反,它處於多個服務的前端,扮演著“智慧路由”或者叢集入口的角色。
你可以用 Ingress 來做許多不同的事情,各種不同型別的 Ingress 控制器也有不同的能力。
GKE 上的預設 ingress 控制器是啟動一個 HTTP(S) Load Balancer。它允許你基於路徑或者子域名來路由流量到後端服務。例如,你可以將任何發往域名 foo.yourdomain.com 的流量轉到 foo 服務,將路徑 yourdomain.com/bar/path 的流量轉到 bar 服務。
使用ingress步驟:
1.部署ingress Nginx;
2.配置ingress niginx規則;
採用ingress暴露容器化應用(nginx):
1.部署一個容器化應用(pod),比如nginx程式
kubectl create deployment nginx --image=nginx
2.暴露該服務
kubectl expose deployment nginx --port=80 --type=NodePort
3.部署ingress nginx
https://github.com/kubernetes/ingress-nginx
ingress-nginx是使用nginx作為反向代理和負載均衡的k8s的ingress控制器;
# 下載
wget kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml
329行spec下加一行:hostNetwork:true
332行修改阿里雲image映象:
阿里雲映象首頁:http://dev.aliyun.com/去搜索ingress-nginx映象
4.應用檔案,自動部署ingress環境
kubectl apply -f deploy.yaml
5.檢視ingress的狀態
kubectl get pods -n ingress-nginx
6.應用配置ingress規則
kubectl apply -f ingress-nginx.yaml
如果報錯:刪除模組
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
再次應用配置ingress檔案
ingress-nginx.yaml配置檔案:
檢查一下:
kubectl get ingress #簡寫kubectl get ins # 查規則
kubectl get service -n ingress-nginx
kubectl get deploy -n ingress-nginx
kubectl get pods -n ingress-nginx
GKE 上用 L7 HTTP Load Balancer 生成的 Ingress 物件的 YAML 檔案類似如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
spec:
backend:
serviceName: other
servicePort: 8080
rules:
- host: foo.mydomain.com
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
- host: mydomain.com
http:
paths:
- path: /bar/*
backend:
serviceName: bar
servicePort: 8080
何時使用這種方式?
如果你想要使用同一個 IP 暴露多個服務,這些服務都是使用相同的七層協議(典型如 HTTP),那麼Ingress 就是最有用的。如果你使用本地的 GCP 整合,你只需要為一個負載均衡器付費,且由於 Ingress是“智慧”的,你還可以獲取各種開箱即用的特性(比如 SSL,認證,路由,等等)。
新增副本數,快速擴容
kind:deployment配置檔案
--replicas=4 # 副本數4
spec:
replicas:4
kubectl apply -f 配置檔名.yaml # 應用配置