Windows docker k8s asp.net core


在上一篇文章 Ubuntu 18 Kubernetes的Install and Deploy 我們在ubuntu在部署了k8s集群, 今天來看看windows下怎么搞。

主要點有:

1) windows 下搭建k8s 單節點

2)ap.net core 制作和發布鏡像 ,重點在於發布到私有的harbor上(Ubuntu18 安裝搭建Harbor​​​​​​​)

3)部署到k8s集群上

安裝

1.下載 k8s-for-docker-desktop,前查看自己docker的版本(我這里是19.03.1所以直接下載master),然后下載對應的分支

2.切換到對應的目錄,開始加載鏡像,這里通過PowerShell的方式加載: .\load_images.ps1 (也可以通過Bash Shell的方式加載:./load_images.sh), 如果出現:在此系統上禁止運行腳本 的錯誤,通過執行 set-ExecutionPolicy RemoteSigned 可以解決

拉取完畢后(需要檢查是否全部成功拉取) 需要在在Docker for Windows中啟用K8S

配置K8s

1.切換運行上下文至docker-for-desktop ,驗證Kubernetes狀態(目前是單節點)

kubectl config use-context docker-for-desktop
kubectl cluster-info
kubectl get nodes

2.部署Kubernetes Dashboard& 開啟API Server訪問代理,向外部提供面板訪問

kubectl create -f kubernetes-dashboard.yaml #需要在k8s-for-docker-desktop 目錄下執行
kubectl proxy --address='0.0.0.0' --port=8008 --accept-hosts='^*$'

創建用戶並獲取token

kubectl create serviceaccount dashboard -n default
kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard
kubectl -n kube-system get secret
kubectl -n kube-system describe secret  <name>


訪問http://localhost:8008/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login 如圖:

輸入token后

准備一個k8sWebApi

在創建webapi項目的(創建的時候選擇啟用docker 會自動生成Dockerfiel文件)

然后切換到目錄自作鏡像 並發布到私有倉庫:(有關harbor請參考 Ubuntu18 安裝搭建Harbor

docker build -t k8swebapi .
#給鏡像打tag(鏡像的格式為,鏡像倉庫IP:端口/鏡像名稱)
docker tag  k8swebapi 192.168.100.3:80/repo-test/k8swebapi:20190809
docker push 192.168.100.3:80/repo-test/k8swebapi
為了保險 我們找一個docker 環境驗證一下:

部署webapi到k8s

1.准備namespace.yaml 

apiVersion: v1
kind: Namespace
metadata:
   name: aspnetcore
   labels:
     name: aspnetcore

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8swebapi
  namespace: aspnetcore
  labels:
    name: k8swebapi
spec:
  replicas: 2
  selector:
    matchLabels:
      name: k8swebapi
  template:
    metadata:
      labels:
        name: k8swebapi
    spec:
      imagePullSecrets:
      - name: regsecret
      containers:
      - name: k8swebapi
        image: 192.168.100.3:80/repo-test/k8swebapi:20190809
        ports:
        - containerPort: 80
        imagePullPolicy: Always

---

kind: Service
apiVersion: v1
metadata:
  name: k8swebapi
  namespace: aspnetcore
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    name: k8swebapi

這里這個deploy.yaml就會告訴K8S關於你的API的所有信息,以及通過什么樣的方式暴露出來讓外部訪問。需要注意的是,這里我們提前為要部署的ASP.NET Core WebAPI項目創建了一個namespace,叫做aspnetcore,因此這里寫的namespace : aspnetcore。K8S中通過標簽來區分不同的服務,因此這里統一name寫成了k8swebapi。在多實例的配置上,通過replicas : 2這個設置告訴K8S給我啟動2個實例起來,當然你可以寫更大的一個數量值。 最后,在spec中告訴K8S我要通過NodePort的方式暴露出來公開訪問。這里因為是私有的harbor所以需要創建regsecret認證,然后在deploy文件引用它:有關向信息可以參考https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

kubectl create secret docker-registry regsecret --docker-server=192.168.100.3:80 --docker-username=admin --docker-password=xxx -n=aspnetcore
#kubectl delete secret regsecret  -n=aspnetcore

注意我們的deploy是有名稱空間的, 所以在創建 secret的時候必須指定-n=aspnetcore

2.通過kubectl部署到K8S (以下操作在ubuntu下的k8s集群同樣適用)

首先,確保你的Docker for Windows以及Kubernetes都啟動起來了。然后,在Powershell中通過kubectl完成API的部署,然后驗證,

kubectl apply -f namespace.yaml
kubectl apply -f deploy.yaml
kubectl get svc -n aspnetcore
#刪除的時候順序要倒過來
#kubectl delete -f deploy.yaml
#kubectl delete -f namespace.yaml

#查看k8swebapi狀態
kubectl get deployment k8swebapi -n aspnetcore
kubectl describe deployment k8swebapi -n aspnetcore
kubectl describe replicaset -n aspnetcore #查看ReplicaSet的狀態
kubectl describe pod -n aspnetcore #查看Pod的狀態

我這里的http://localhost:xxx/api/values 在ubuntu下是不能訪問的(在windows下的k8s 是1.14.3,ubuntu是1.15.2 估計是版本的問題)

3.在K8S中對WebAPI的伸縮

在Dashboard中,我們可以可視化地對我們的Deployment進行容器實例的伸縮,在彈出的伸縮選項對話框中輸入個數,例如我們這里從2個縮減為1個,然后確定。如下圖所示:

除了在Dashboard中可視化地操作進行伸縮,也可以通過kubectl來進行,例如下面這句命令,將容器實例擴展到3個。需要注意的是,由於我們的k8swebapi所在的命名空間是在aspnetcore下,因此也需要指明--namespace=aspnetcore。

 kubectl scale deployment k8swebapi --replicas=3 --namespace=aspnetcore

在K8S中,提供了一個autoscale接口來實現服務的自動伸縮,它會采用默認的自動伸縮策略(例如根據CPU的負載情況)來幫助我們實現彈性伸縮的功能。例如下面這句命令可以實現我們的k8s-demo可以伸縮的范圍是1~3個,根據負載情況自己伸縮,在沒有多少請求量壓力很小時收縮為一個,在壓力較大時啟動另一個實例來降低負載。

kubectl autoscale deployment k8swebapi --min=1 --max=3 --namespace=aspnetcore

來一個ubuntu18 k8s集群下面的機截圖

--2019-8-15

滾動更新

修改deploy.yaml文件,並執行 kubectl apply -f deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8swebapi
  namespace: aspnetcore
  labels:
    name: k8swebapi
spec:
  replicas: 5
  minReadySeconds: 10 
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    
  selector:
    matchLabels:
      name: k8swebapi
  template:
    metadata:
      labels:
        name: k8swebapi
    spec:
      imagePullSecrets:
      - name: regsecret
      containers:
      - name: k8swebapi
        image: 192.168.100.5:80/admin/k8swebapi:20190809
        ports:
        - containerPort: 80
        imagePullPolicy: Always

---

kind: Service
apiVersion: v1
metadata:
  name: k8swebapi
  namespace: aspnetcore
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
  selector:
    name: k8swebapi

修改程序重新push

修改deploy的鏡像路徑  image: 192.168.100.5:80/admin/k8swebapi:20190815 ,然后執行 kubectl apply -f deploy.yaml 更新后如下,api已經發生變化

參考 

K8S的滾動升級RollingUpdate​​​​​​​

k8s 滾動升級

K8s-yaml的使用及命令

ASP.NET Core on K8S深入學習(1)K8S基礎知識與集群搭建

ASP.NET Core on K8S學習初探(2)K8S基本概念快速一覽

ASP.NET Core on K8S學習初探(3)部署API到K8S

ASP.NET Core on K8S深入學習(3)Deployment


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM