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,这里面有

posted on 2020-03-23 20:20  Alternatives  阅读(1314)  评论(0编辑  收藏  举报

导航