k8实战
初始化集群-minikube版k8s
minikube使用指南如下,可以直接看一下官方文档
https://kubernetes.io/docs/tutorials/hello-minikube/
启动minikube集群
查看基本信息
查看dashboard
以后就可以通过浏览器中的dashboard查看集群的情况了
运行一个helloworld-minikube版k8s
运行一个Deployment,控制了一个Pod,其中运行着一个helloworld容器
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
此时还不能访问,因为Pod部署在集群内部,但是没有部署对应的Service,无法通过Node的ip进行访问。
创建Service
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
这个命令是使用kubectl为名为"hello-node"的部署创建一个暴露 Service。它将创建一个类型为LoadBalancer的 Service,并将流量转发到部署中运行的容器的端口8080。
具体来说,这个命令的含义如下:
- `kubectl expose deployment hello-node`:使用kubectl命令为名为"hello-node"的部署创建一个 Service。
- `--type=LoadBalancer`:定义 Service 的类型为 LoadBalancer。LoadBalancer类型的 Service 在云平台上会自动创建一个负载均衡器,并将请求流量分发到部署中运行的容器实例。
- `--port=8080`:指定 Service 的端口号为8080。这个端口号是 Service 对外暴露的端口,当请求到达 Service 的这个端口时,会被转发到部署中容器的同一个端口号。
通过执行此命令,你创建了一个暴露类型为LoadBalancer的 Service,将流量转发到运行在名为"hello-node"的部署中的容器。LoadBalancer类型的 Service 在云平台上会自动创建一个负载均衡器,可以实现将流量均衡分发到部署中的多个容器实例上,以提高应用程序的可用性和可扩展性。其他客户端可以通过访问该 Service 暴露的端口(例如8080)来访问部署中的容器。
此时该Service还是pending状态
可以通过minikube命令访问这个Service
minikube service hello-node
但是,我不想这样访问,我想直接通过NodeIP访问,这就需要自己写一个Service。
首先,找到Pod的标签
然后写一个新的Service
apiVersion: v1
kind: Service
metadata:
name: hello-node-service
spec:
type: NodePort
selector:
app: hello-node
ports:
- protocol: TCP
port: 8080 # service的port
targetPort: 8080 # pod的port
nodePort: 30000 # 给node分配的port
运行这个yaml
本机可以通过30000端口访问了
访问不了,感觉可能是这个容器有问题,自己再跑一个别的
运行一个nginx容器-OrbStack版k8s
说明:OrbStack自己的k8s的网络多做了一点手脚,看起来很方便,但还是要理解内部端口转发的原理。
# 创建一个deployment nginx 默认端口80(集群内部)
kubectl create deployment nginx --image nginx
# 创建一个NodePort类型的Service,关联nginx的Pod,并关联其80端口
kubectl expose deploy/nginx --type=NodePort --port=80
# 查看Service的信息,主要是查看clusterIp和这个service对外(集群内)暴露的端口32042
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
nginx NodePort 192.168.194.217 <none> 80:32042/TCP
# 集群外直接访问即可
curl -I localhost:32042
HTTP/1.1 200 OK
Server: nginx/1.25.2
这里,本地的mac可以直接访问k8s集群内的service的端口32042,应该是OrbStack做了一层映射。
其实OrbStack还支持直接访问clusterip甚至pod的ip,十分灵活,让人不免怀疑,本地的mac也在集群内部。
运行2个微服务容器-正式应用版
先部署一个redis-yaml配置文件方式
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: redis
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
serviceName: redis-svc
template:
metadata:
labels:
app: redis
spec:
containers:
- command:
- redis-server
- '--requirepass'
- 'redis' # 初始密码
image: 'redis:7.0.12'
imagePullPolicy: Always
name: redis
ports:
- containerPort: 6379
protocol: TCP
dnsPolicy: ClusterFirst
restartPolicy: Always
updateStrategy:
type: RollingUpdate
---
apiVersion: v1
kind: Service
metadata:
name: redis-svc # service的name,很重要,相当于域名
spec:
externalTrafficPolicy: Local
ports:
- name: redis-service
port: 6379
protocol: TCP
targetPort: 6379
selector:
app: redis
sessionAffinity: None
type: NodePort
再部署一个自己的应用(这个应用自己可以随便写,暴露一个接口出来方便测试即可),这里配置要使用k8s访问内部service的形式,这里host已经改成了redis的service的名字
应用代码编辑完成后,Maven 打包,然后docker做镜像。此处可以自行学习。
创建一个deployment-kubectl命令方式
kubectl create deployment redis-test --image redis-test:10006
访问pod,说明这个pod找到了redis的service,本k8s集群内部可以通过service的name进行访问。
给这个pod关联一个service
kubectl expose deploy/redis-test --type=NodePort --port=8080
有了这个NodePort类型的Service,既可以通过它的cluster ip访问redis-test,也可以直接通过localhost访问redis-test
参考视频
本文随行视频如下:
【k8s简单实战,如何在k8s集群内部署微服务】 https://www.bilibili.com/video/BV1pF4m1j7zv/?share_source=copy_web