在本地,一键启动 k8s 集群,并将服务部署到 k8s 集群上。
minikube 是一个虚拟机,启动后会在内部自动创建一个 k8s 集群。minikube 是 k8s 的 node。
minikube 安装:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikubeminikube start \
--extra-config=apiserver.service-node-port-range=1-65535 \
--listen-address=0.0.0.0其中,
kubectl 可方便地与 k8s 集群进行交互。minikube 内部默认安装 kubectl,例如查看所有 pod:
minikube kubectl -- get pods可以为 minikube kubectl -- 命令起一个别名:
alias kubectl="minikube kubectl --"查看所有 pod 命令可简化为:
kubectl get podskubectl 常用的命令:
kubectl get svc
kubectl get ds
说明:pod 是 k8s 的管理单元,pod 中可包含多个容器,pod 中的所有容器共享 namespace。
停止 minikube:
minikube stop删除 k8s 集群:
minikube deleteLens 是 k8s 集群的操作界面,可方便地与 k8s 集群进行交互。
wget https://api.k8slens.dev/binaries/Lens-5.4.4-latest.20220325.1.amd64.deb
sudo dpkg -i Lens-5.4.4-latest.20220325.1.amd64.deblens左边菜单栏中列出来 k8s 中的各种资源,可对各种资源进行查看、修改、删除。
例如,查看所有 pod:

对 Deployment 或 StatefulSet 扩缩容:

进入容器:

将 k8s 中 TCP 服务的端口映射到主机:

内置了 Helm,Helm 用来管理 k8s 应用,可发现、共享和使用为 k8s 构建的软件。
例如,在 k8s 安装 redis 或 nats:

部署:
docker run -d --name xremote_nginx --network host \
-v ${HOME}/nginx/nginx.conf:/etc/nginx/nginx.conf nginx${HOME}/nginx/nginx.conf 中添加了要代理的 minikube 中的 UDP 服务端口。示例如下:
stream {
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
access_log /var/log/nginx/udp-access.log proxy;
open_log_file_cache off;
upstream signaling-0 {
server 192.168.49.2:21116;
}
server{
listen 21116 udp reuseport;
proxy_connect_timeout 8s;
proxy_pass signaling-0;
}
}使用 Nginx 的原因:代理 minikube 中的 UDP 服务。
deployment.yml:定义资源如何部署。
apiVersion: apps/v1
kind: Deployment
metadata:
name: signaling-0
spec:
selector:
matchLabels:
app: signaling-0
replicas: 1
template:
metadata:
labels:
app: signaling-0
spec:
containers:
- name: signaling
image: code.com:6543/signaling-server:latest
ports:
- name: server
containerPort: 21116
protocol: UDP
imagePullPolicy: IfNotPresent
env:
- name: RUN_XREMOTE_SERVER_MODE
value: production
command: ["/bin/bash"]
args: ["-c", "/opt/signaling_server/run.sh"]
volumeMounts:
- name: config
mountPath: /opt/signaling_server/config/signaling/production.toml
subPath: production.toml
volumes:
- name: config
configMap:
name: signaling字段说明:
config_map.yml:存储一些配置信息。
apiVersion: v1
kind: ConfigMap
metadata:
name: signaling
data:
production.toml: |-
debug = false
[signaling]
data_center = "beijing"
service_name = "signaling"
signaling_port = 21116在 Kubernetes 中,有几种特殊的 Volume,它们的作用是为容器提供预先定义好的数据。所以,从容器的角度来看,这些 Volume 里的信息就是仿佛是被 K8s “投射”(Project)进入容器当中的。到目前为止,Kubernetes 支持的 Projected Volume 一共有四种:Secret、ConfigMap、Downward API 和 ServiceAccountToken。
前面的 deployment.yml 中的 spec.template.spec.volumes 中会声明一个 volume,该 volume 的来源是一个 ConfigMap,然后该 volume 会被挂载到 /opt/signaling_server/config/signaling/production.toml。
service.yml:service 的种类较多,其中 NodePort 的作用是将服务端口暴露在 k8s 外部。
kind: Service
apiVersion: v1
metadata:
name: signaling-0
spec:
ports:
- name: server
nodePort: 21116
port: 21116
targetPort: 21116
protocol: UDP
selector:
app: signaling-0
type: NodePort将服务暴露在集群外的方式:
本例中:
要访问这个 Service,只需要访问:<node 的 IP 地址>:21116
以上几个 yml 文件也可以放在一个 yml 文件中,并以 ”---“ 分隔。
对每个 yml 文件执行:
kubectl apply -f xxx.yml方式 1)Lens 界面方式:

方式 2)命令行方式:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
discovery-568569c86f-jflrq 1/1 Running 1 (51m ago) 58m
$ kubectl exec -it discovery-568569c86f-jflrq -- /bin/sh
# ls
config discovery-server log run.sh sum.md5
# ls log
discovery_server_20220408-0607.log说明:由于 服务的日志写在了文件中,而不是标准输出中,所以用 kubectl logs 命令看不到日志。
发生 ErrImagePull 错误:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
discovery-568569c86f-njmf4 0/1 ErrImagePull 0 41m是因为 minikube 没有权限拉取镜像。
解决:
minikube -p minikube docker-env
eval $(minikube -p minikube docker-env)
cd xremote/server
bash release_build.sh discovery相当于把镜像 push 到了 minikube 中。
或者这种方式应该也可以:https://minikube.sigs.k8s.io/docs/handbook/untrusted_certs/ ,本人没有尝试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。