以下记录这两天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,这里面有