目录

Java on minikube

minikube 用于在本地运行 kubernetes 环境,用来开发和测试。

导出 minikube 的 kubeconfig

1
2
kubectl config view --minify --raw > ~/minikube-config.yaml
mount local dir

https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/

将本地文件挂载到 minikube 环境

1
2
minikube mount /Users/ynthm/workspace/project-demo:/app/project-demo
minikube mount /Users/ynthm/.m2:/root/.m2 &

Java 镜像

Dockerfile

1
2
FROM maven:3.8.5-openjdk-17
CMD /app/project-demo/docker-run.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/env bash

debug=true
VAULT_ADDR="http://192.168.19.87:18202"
JVM_DEBUG_PORT="15002"

if $debug; then
  jvmDebugArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$JVM_DEBUG_PORT"
fi

echo $jvmDebugArguments

cd ~/auth && java -XX:+UseZGC -Xlog:gc -Xms256M -Xmx512M $jvmDebugArguments -jar /app/project-demo/target/app-1.0.17.jar --spring.profiles.active=local --spring.cloud.vault.url="$VAULT_ADDR"
1
2
3
4
eval $(minikube docker-env)
# 在当前终端窗口中使用。这将为当前会话使用 minikube docker-env。
# 镜像需要在 minikube 虚拟机上。所以现在你需要再次构建你的图像。
docker build -t hot-reload-java .
1
2
3
4
minikube image ls
minikube image pull maven:3.8.5-openjdk-17
# 有 Dockerfile 的地方才能执行
minikube image build -t hot-reload-java .

serviceaccount

1
2
3
4
kubectl create sa hot-reload-serviceaccount
kubectl describe sa hot-reload-serviceaccount

code hot-reload-role.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: hot-reload-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["extensions", "apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
1
2
3
4
kubectl create -f hot-reload-role.yaml
kubectl describe role hot-reload-role

code hot-reload-role-binding.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: null
  name: hot-reload-role-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: hot-reload-role
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: hot-reload-serviceaccount
1
2
3
4
kubectl create -f hot-reload-role-binding.yaml
kubectl describe RoleBinding hot-reload-role-binding

vim hot-reload-configmap.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # property-like keys; each key maps to a simple value
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"

  # file-like keys
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5        
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true    
1
2
3
kubectl create configmap hot-reload-configmap --from-file=hot-reload-configmap.yaml

code deployment.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hot-reload-deployment
spec:
  selector:
    matchLabels:
      app: hot-reload
  replicas: 1
  template:
    metadata:
      labels:
        app: hot-reload
    spec:
      containers:
      - envFrom:
        - configMapRef:
            name: hot-reload-configmap
        name: hot-reload-java
        image: hot-reload-java
        imagePullPolicy: Never
        ports:
        - containerPort: 8080
        - containerPort: 15002
        volumeMounts:
        - mountPath: /root/auth
          name: app-path
        - mountPath: /root/.m2
          name: maven-path
      serviceAccount: hot-reload-serviceaccount
      serviceAccountName: hot-reload-serviceaccount
      volumes:
      - name: app-path
        hostPath:
          path: /root/auth
      - name: maven-path
        hostPath:
          path: /root/.m2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kubectl apply -f deployment.yaml
kubectl get deployment
kubectl describe deploy hot-reload-deployment
kubectl delete deployment hot-reload-deployment

# 查看 ReplicaSet
kubectl get rs
kubectl describe rs hot-reload-deployment-74cbbbf648

# 查看 Pod
kubectl get po
kubectl logs -f hot-reload-deployment-74cbbbf648-mjvjp
kubectl delete pod hot-reload-deployment-74cbbbf648-mjvjp