minikube使用記錄


以下記錄這兩天minikube操作手順

環境:win10企業版,i5,8G內存
本機原裝有docker,Hyper-V已經開啟,但是這里遇到些問題
在'Hyper-V虛擬機監控程序'勾選的情況下,docker可用,virtualbox無法選擇64位的鏡像,也就是說minikube會啟動失敗。而不勾選'Hyper-V虛擬機監控程序'則docker無法啟動。
應該是我電腦本身裝的其他東西引起的,不細究了。
最終選擇了放棄使用本機docker,也就是取消'Hyper-V虛擬機監控程序'勾選
以下操作基本全在admini權限下執行,參考鏈接如下
https://minikube.sigs.k8s.io/docs/start/windows/
https://kubernetes.io/docs/home/

1.安裝virtualbox

同樣可以直接使用hyper-v,我覺得hyper-v比較費資源
https://www.virtualbox.org/wiki/Downloads

2.安裝minikube

本機原先就有Chocolatey,所以選擇了這種方式。
choco install minikube

3.啟動minikube

由於網絡問題我選擇了阿里,我試過不少方式,至少下面這句成功了
minikube start --registry-mirror=https://registry.docker-cn.com --vm-driver="virtualbox"    --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
第一次是比較慢的,完成后可以在virtualbox中看到minikube的虛擬機
同樣可以選擇hyper-v,不過要多一個在hyper-v中創建網絡的步驟。以下命令我沒有實際操作過
minikube start --registry-mirror=https://registry.docker-cn.com --vm-driver="hyperv"  --hyperv-virtual-switch="NET" --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

這樣一個minikube就啟動起來了,命令官網都有,下面舉個例子

寫了一個golang和dotnetcore的demo,部署到minikube上
main.go,這個程序最后部署的結果是setcookie/getcookie無法獲取到,暫時不管了
當時學golang隨手寫的
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"reflect"
	"runtime"
	"time"
)

func handler(writer http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(writer, "hello, %s!", request.URL.Path[1:])
}
func handler1(writer http.ResponseWriter, request *http.Request) {
	fmt.Fprintf(writer, "hello1, %s!", request.URL.Path[1:])
}

func log(h http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		name := runtime.FuncForPC(reflect.ValueOf(h).Pointer()).Name
		fmt.Println("handler funcation called - ", name)
		h(w, r)
	}
}

func headers(w http.ResponseWriter, r *http.Request) {
	h := r.Header
	fmt.Fprintln(w, h)
}

func body(w http.ResponseWriter, r *http.Request) {
	length := r.ContentLength
	body := make([]byte, length)
	r.Body.Read(body)
	fmt.Fprintln(w, string(body))
}

func form1(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	fmt.Fprintln(w, r.PostForm)
}
func form2(w http.ResponseWriter, r *http.Request) {
	r.ParseMultipartForm(1024)
	fmt.Fprintln(w, r.MultipartForm)
}

func redirect(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Location", "https://www.cnblogs.com/")
	w.WriteHeader(302)
}

func jsonHandle(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	post := &Post{
		User:    "THIS",
		Threads: []string{"one", "three"},
	}
	jsonString, _ := json.Marshal(post)
	w.Write(jsonString)
}

func setcookie(w http.ResponseWriter, r *http.Request) {
	h, _ := time.ParseDuration("8h10m")
	c1 := http.Cookie{
		Name:     "a",
		Value:    "b",
		HttpOnly: true,
		Expires:  time.Now().Add(h),
	}
	c2 := http.Cookie{
		Name:     "f",
		Value:    "m",
		HttpOnly: true,
		Expires:  time.Now().Add(h),
	}

	//w.Header().Set("Set-Cookie", c1.String())
	//w.Header().Add("Set-Cookie", c2.String())
	http.SetCookie(w, &c1)
	http.SetCookie(w, &c2)
}

func getcookie(w http.ResponseWriter, r *http.Request) {
	h := r.Header["Cookie"]
	fmt.Fprintln(w, h)

	cl, err := r.Cookie("a")
	if err != nil {
		fmt.Fprintln(w, err)
	}
	cs := r.Cookies()
	fmt.Fprintln(w, cl)
	fmt.Fprintln(w, cs)
}

type Post struct {
	User    string
	Threads []string
}

func main() {
	http.HandleFunc("/sss/", handler1)
	http.HandleFunc("/", log(handler))
	http.HandleFunc("/header/", headers)
	http.HandleFunc("/body/", body)
	http.HandleFunc("/form1/", form1)
	http.HandleFunc("/form2/", form2)
	http.HandleFunc("/redirect/", redirect)
	http.HandleFunc("/json/", jsonHandle)
	http.HandleFunc("/setcookie/", setcookie)
	http.HandleFunc("/getcookie/", getcookie)
	http.ListenAndServe(":8080", nil)
}

Dockerfile
FROM golang:alpine AS development
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
COPY . $GOPATH/src/mypackage/myapp/
WORKDIR $GOPATH/src/mypackage/myapp/
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go get -d -v
RUN go build -o /go/bin/helloapp
FROM scratch
COPY --from=development /go/bin/helloapp /go/bin/helloapp
EXPOSE 8080
ENTRYPOINT ["/go/bin/helloapp"]
然后准備Build,這時候問題來,我docker起不起來,怎么build,還好可以進到minikube里面build。
那么現在就是要把我的文件發到minikube的虛擬機里面,操作如下:
順便一提minikube虛擬機的登錄密碼是: tcuser
1.首先使用minikube ssh進入虛擬機,創建目錄,修改權限
sudo mkdir ./golang
sudo chmod 777 ./golang
2.powershell執行scp命令,把main.go和Dockerfile傳上去
scp -r $(minikube ssh-key) C:\Users\golang\k8s\helloapp docker@$(minikube ip):./golang 
我即使這么寫,依然提示要密碼,坑!!輸入tcuser即可
3.minikube ssh到golang目錄下執行build,然后打tag,push,最后退出shh
docker build -t go-web-test-200316 .
docker tag go-web-test-200316:latest futugyousuzu/go-web-test-200316:latest
docker push futugyousuzu/go-web-test-200316:latest
exit
4.編寫service和deployment
golangservice
apiVersion: v1
kind: Service
metadata:
  name: golangdemo
spec:
  type: LoadBalancer 
  selector:
    app: golangdemo
  ports:
  - port: 8080
    targetPort: 8080

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: golangdemo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: golangdemo
  template:
    metadata:
      labels:
        app: golangdemo
    spec:
      containers:
      - name: golangdemo
        image: futugyousuzu/go-web-test-200316:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"
        ports:
        - containerPort: 8080


5.執行apply
kubeclt apply -f golang.yaml
查看下發現EXTERNAL-IP為pending,即使我在另一個終端執行了minikube tunnel也是這樣。但是從port可以明顯訪問端口號
C:\Code\Golang>kubectl get svc
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
golangdemo     LoadBalancer   10.101.168.228   <pending>     8080:32704/TCP   17s
還可以執行minikube ip獲取集群ip
C:\Code\Golang>minikube ip
192.168.99.105
這樣就可以通過http://10.101.168.228:8080/或是http://192.168.99.105:32704/ 訪問部署好的服務了
minikube還提供了另外一種方式,這樣會直接打開瀏覽器。加上--url可以顯示服務ip。
minikube service golangdemo
寫一個dotnetcore的demo試試,參照微軟官網的Dockerfile
一樣的步驟我就省略了,下次可以試試net5
創建項目,添加Dockerfile
dotnet new webapi -n myMicroservice
Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY myMicroservice.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c release -o /app

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "myMicroservice.dll"]
push完后編寫yaml
dotnetcore-demo.yaml
apiVersion: v1
kind: Service
metadata:
  name: dotnetcoredemo
spec:
  selector:
    app: dotnetcoredemo
  type: LoadBalancer 
  ports:
  - port: 8083
    targetPort: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dotnetcoredemo
spec:
  selector:
    matchLabels:
      app: dotnetcoredemo
  template:
    metadata:
      labels:
        app: dotnetcoredemo
    spec:
      containers:
      - name: dotnetcoredemo
        image: futugyousuzu/k8s-dotnetcore-demo-0320:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"
        ports:
        - containerPort: 80


這里有個小問題,launchSettings.json里面是5000,而實際他run的時候是80,所以上面yaml里面才寫了80。是因為Dockerfile里面沒有設置EXPOSE暴露端口,現在也不想改了。

.netcore的程序也部署完畢,下面試用一下Helm

1.設置repo

helm repo add svc-cat https://svc-catalog-charts.storage.googleapis.com

2.創建chart,修改yaml文件,具體就不貼了

helm create hello-golang

3.執行檢查,只能做基本的檢查

helm lint hello-golang

4.打包

helm package hello-golang

5.預發布試試

helm install ./hello-golang-0.1.0.tgz --debug --dry-run  --name-template hello-golang-helm

6.發布到minikube

helm install --name-template hello-golang-helm ./hello-golang-0.1.0.tgz

一套基本就是這樣了

一下記錄這兩天所用到的命令,方便查詢
command
 minikube start --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --vm-driver=virtualbox  --image-mirror-country cn  --registry-mirror=https://registry.docker-cn.com --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.8.0.iso 
 minikube start --registry-mirror=https://registry.docker-cn.com --vm-driver="hyperv"  --hyperv-virtual-switch="NET" --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
 minikube start --registry-mirror=https://registry.docker-cn.com --vm-driver="virtualbox"    --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
 
 
 minikube ssh docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.0docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
 
 
 minikube ssh
 minikube status
 minikube dashboard 
 minikube tunnel
 minikube ip
 minikube service golangdemo
 minikube service golangdemo --url
 minikube addons enable ingress
 minikube cache add futugyousuzu/go-web-test-200316:latest
 
 
 kubectl proxy --port=8080
 kubectl port-forward redis-master-8556bd886d-x6s8w 7000:6379
 kubectl exec -it redis-master-8556bd886d-x6s8w redis-cli
 kubectl expose deployment hello-world --type=LoadBalancer --name=example-service
 kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=golanguser
 kubectl get clusterrolebindings cluster-admin-binding -o yaml
 kubectl apply -k .
 
 
 docker container prune
 docker rmi $(docker images -q) -f
 docker build -t go-web-test-200316 .
 docker tag go-web-test-200316:latest futugyousuzu/go-web-test-200316:latest
 docker push futugyousuzu/go-web-test-200316:latest
 docker search futugyousuzu
 docker run -p 8080:8080 futugyousuzu/go-web-test-200316:latest
 docker run -d -p 5000:5000 --restart=always --name registry registry
 
 
 helm repo add svc-cat https://svc-catalog-charts.storage.googleapis.com
 helm search repo  service-catalog
 helm create hello-golang
 helm lint hello-golang
 helm package hello-golang
 helm install ./hello-golang-0.1.0.tgz --debug --dry-run  --name-template hello-golang-helm
 helm install --name-template hello-golang-helm ./hello-golang-0.1.0.tgz
 
 sudo mkdir ./redis/demo
 sudo chmod 777 ./redis/demo
 scp -r $(minikube ssh-key) C:\Users\qxu7999\Desktop\PDF\golang\k8s\1.configmap\redis docker@$(minikube ip):./redis/demo 
 scp -r $(minikube ssh-key) C:\Users\qxu7999\Desktop\PDF\kubedotnet\myMicroservice docker@$(minikube ip):./dotnet 
 password tcuser
 
 
 https://github.com/anjia0532/gcr.io_mirror
 在學習k8s官網時會看到各種無法訪問的image,這里面有


免責聲明!

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



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