一、环境准备
- kubenetes
- k8s
- harbor
- dnsmasq
- helm
- cert-manager
- traefik
- metallb
gitlab 占用了 ssh 22 端口,这里为了图方便,不换 ip 了,就改用默认的 2222 端口。
二、安装
2.1 traefik 配置
- 添加 helm 仓库
1 2
| helm repo add jumpserver https://jumpserver.github.io/helm-charts helm repo update jumpserver
|
- 给 traefik 添加端口的配置
1
| vim /opt/selfhost/infra-deployment/traefik/v3-traefik-ssh.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
| ingressClass: enabled: true isDefaultClass: true
api: dashboard: true
ingressRoute: dashboard: enabled: false
ports: ssh: port: 2222 exposedPort: 22 protocol: TCP expose: default: true jms-ssh: port: 2223 exposedPort: 2222 protocol: TCP expose: default: true
|
- 更新
traefik
1
| helm upgrade traefik traefik/traefik -n traefik -f /opt/selfhost/infra-deployment/traefik/v3-traefik-ssh.yaml
|
- 验证
1
| kubectl -n traefik get svc traefik -o wide
|
2.2 jms 依赖的组件
主要是 pgsql、redis、命名空间、ingress 等
- 编辑资源清单文件
1
| vim jumpserver-stack.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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
apiVersion: v1 kind: Namespace metadata: name: jumpserver ---
apiVersion: v1 kind: Secret metadata: name: jms-postgresql namespace: jumpserver type: Opaque stringData: POSTGRES_DB: jumpserver POSTGRES_USER: jumpserver POSTGRES_PASSWORD: "u4bWW0RTZMFeqVPGI315" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: jms-postgresql-data namespace: jumpserver spec: accessModes: - ReadWriteOnce storageClassName: nfs-client resources: requests: storage: 10Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: jms-postgresql namespace: jumpserver spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: jms-postgresql template: metadata: labels: app: jms-postgresql spec: containers: - name: postgresql image: postgres:16-alpine envFrom: - secretRef: name: jms-postgresql env: - name: PGDATA value: /var/lib/postgresql/data/pgdata ports: - containerPort: 5432 readinessProbe: exec: command: ["pg_isready", "-U", "jumpserver", "-d", "jumpserver"] initialDelaySeconds: 10 periodSeconds: 5 volumeMounts: - name: data mountPath: /var/lib/postgresql/data volumes: - name: data persistentVolumeClaim: claimName: jms-postgresql-data --- apiVersion: v1 kind: Service metadata: name: jms-postgresql namespace: jumpserver spec: selector: app: jms-postgresql ports: - port: 5432 targetPort: 5432 ---
apiVersion: v1 kind: Secret metadata: name: jms-redis namespace: jumpserver type: Opaque stringData: REDIS_PASSWORD: "62rnrIY03ilA8TZF3vI3" --- apiVersion: apps/v1 kind: Deployment metadata: name: jms-redis namespace: jumpserver spec: replicas: 1 selector: matchLabels: app: jms-redis template: metadata: labels: app: jms-redis spec: containers: - name: redis image: redis:7-alpine args: ["--requirepass", "$(REDIS_PASSWORD)"] env: - name: REDIS_PASSWORD valueFrom: secretKeyRef: name: jms-redis key: REDIS_PASSWORD ports: - containerPort: 6379 readinessProbe: exec: command: ["sh", "-c", "redis-cli -a \"$REDIS_PASSWORD\" ping"] initialDelaySeconds: 5 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: jms-redis namespace: jumpserver spec: selector: app: jms-redis ports: - port: 6379 targetPort: 6379 ---
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: jms-web namespace: jumpserver annotations: cert-manager.io/cluster-issuer: qx-ca-issuer spec: ingressClassName: traefik tls: - hosts: - jms.qx.lab secretName: jms-qx-lab-tls rules: - host: jms.qx.lab http: paths: - path: / pathType: Prefix backend: service: name: jms-jumpserver-jms-web port: number: 80 ---
apiVersion: traefik.io/v1alpha1 kind: IngressRouteTCP metadata: name: jms-ssh namespace: jumpserver spec: entryPoints: - jms-ssh routes: - match: HostSNI(`*`) services: - name: jms-jumpserver-jms-koko port: 2222
|
- 创建资源
1
| kubectl apply -f jumpserver-stack.yaml
|
- 验证
1 2
| kubectl -n jumpserver rollout status deploy/jms-postgresql kubectl -n jumpserver rollout status deploy/jms-redis
|
2.3 helm 安装 jumpserver
- 创建
values.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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
ingress: enabled: false
externalDatabase: engine: postgresql host: jms-postgresql port: 5432 user: jumpserver password: "u4bWW0RTZMFeqVPGI315" database: jumpserver
externalRedis: host: jms-redis port: 6379 password: "62rnrIY03ilA8TZF3vI3"
core: config: secretKey: "E4TbGLMRiSLSORtZpDaOeAFcZE4oppgKcsx1EZb55l169AY9WV" bootstrapToken: "E0BQP33Vm6GQ2NNpwf037R1i" log: level: ERROR env: SESSION_EXPIRE_AT_BROWSER_CLOSE: true DOMAINS: "jms.qx.lab:443" persistence: storageClassName: nfs-client accessModes: - ReadWriteMany size: 10Gi
koko: service: type: ClusterIP web: port: 5000 ssh: port: 2222 persistence: storageClassName: nfs-client accessModes: - ReadWriteMany size: 10Gi
lion: persistence: storageClassName: nfs-client accessModes: - ReadWriteMany size: 10Gi
chen: persistence: storageClassName: nfs-client accessModes: - ReadWriteMany size: 5Gi
web: persistence: storageClassName: nfs-client accessModes: - ReadWriteMany size: 1Gi
xpack: enabled: false
|
- 安装
1
| helm install jms jumpserver/jumpserver -n jumpserver -f values.yaml
|
- 验证
1
| kubectl -n jumpserver get pods -w
|
三、验证
- 浏览器访问验证
1 2 3
| 地址: https://jms.qx.lab 用户名: admin 密码: ChangeMe
|
- ssh验证
1
| ssh -p 2222 admin@jms.qx.lab
|