• 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:Usersgolangk8shelloapp 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:CodeGolang>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:CodeGolang>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:Usersqxu7999DesktopPDFgolangk8s1.configmap
    edis docker@$(minikube ip):./redis/demo 
     scp -r $(minikube ssh-key) C:Usersqxu7999DesktopPDFkubedotnetmyMicroservice docker@$(minikube ip):./dotnet 
     password tcuser
     
     
     https://github.com/anjia0532/gcr.io_mirror
     在学习k8s官网时会看到各种无法访问的image,这里面有
    
  • 相关阅读:
    贪心算法解汽车加油站问题
    Kickstart Practice Round 2017---A
    win8.1系统下安装ubuntu实现双系统实践教程
    2017年1月15日--牛客网
    想写点什么而已
    Java中this和super的用法总结
    数据库练习(16年12月27日)-- 牛客网
    Technical Development Guide---for Google
    Java 自动装箱与拆箱(Autoboxing and unboxing)
    [LeetCode] Department Highest Salary -- 数据库知识(mysql)
  • 原文地址:https://www.cnblogs.com/suzu/p/12554761.html
Copyright © 2020-2023  润新知