以下記錄這兩天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,這里面有