k8s(4)-使用服务公开应用程序
Kubernetes中的服务是一个抽象,它定义了一组逻辑Pod和一个访问它们的策略。服务允许从属Pod之间的松散耦合。与所有Kubernetes对象一样,使用YAML (首选)或JSON 定义服务。服务所针对的Pod集合通常由LabelSelector确定。
尽管每个Pod都具有唯一的IP地址,但如果没有服务,这些IP不会在群集外部公开。服务允许您的应用程序接收流量。通过type
在ServiceSpec中指定a ,可以以不同方式公开服务:
- ClusterIP(默认) - 在群集中的内部IP上公开服务。此类型使服务只能从群集中访问。
- NodePort - 使用NAT在集群中每个选定节点的同一端口上公开服务。使用可从群集外部访问服务
<NodeIP>:<NodePort>
。ClusterIP的超集。 - LoadBalancer - 在当前云中创建外部负载均衡器(如果支持),并为服务分配固定的外部IP。NodePort的超集。
- ExternalName -
externalName
通过返回带有名称的CNAME记录,使用任意名称(在规范中指定)公开服务。没有代理使用。此类型需要v1.7或更高版本kube-dns
。
1. 查看现有的部署
1 2 3 | [root@master ~] # kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1 /1 1 1 4h12m |
2. 通过expose命令和NodePort参数创建一个新服务
1 2 | [root@master ~] # kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080 service /kubernetes-bootcamp exposed |
3. 查看创建的服务
1 2 3 4 | [root@master ~] # kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443 /TCP 2d12h kubernetes-bootcamp NodePort 10.98.200.115 <none> 8080:31238 /TCP 16s |
查看详细信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@master ~] # kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443 /TCP 2d13h kubernetes-bootcamp NodePort 10.98.200.115 <none> 8080:31238 /TCP 12m [root@master ~] # kubectl describe service/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: run=kubernetes-bootcamp Annotations: <none> Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.98.200.115 Port: < unset > 8080 /TCP TargetPort: 8080 /TCP NodePort: < unset > 31238 /TCP Endpoints: 10.244.0.15:8080 Session Affinity: None External Traffic Policy: Cluster Events: <none> |
- 8080: Pod的端口
- 31238: NodePort,对集群外部公开
- Endpoints: Pod的IP+端口
4. 打印NodePod
1 2 3 | [root@master ~] # export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') [root@master ~] # echo NODE_PORT=$NODE_PORT NODE_PORT=31238 |
5. 访问服务
1 2 | [root@master ~] # curl http://192.168.0.10:31238 Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7f56b875dc-6zbjt | v =1 |
6. 为Pod创建标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@master ~] # export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')<br> [root@master ~] # echo Name of the Pod: $POD_NAME Name of the Pod: kubernetes-bootcamp-7f56b875dc-6zbjt<br> [root@master ~] # kubectl label pod $POD_NAME app=v1 pod /kubernetes-bootcamp-7f56b875dc-6zbjt labeled<br> [root@master ~] # kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-7f56b875dc-6zbjt 1 /1 Running 0 4h52m<br> [root@master ~] # kubectl describe pods Name: kubernetes-bootcamp-7f56b875dc-6zbjt Namespace: default Priority: 0 PriorityClassName: <none> Node: master /192 .168.0.10 Start Time: Fri, 25 Jan 2019 09:55:50 +0800 Labels: app=v1 |
7. 通过标签查找Pod
1 2 3 | [root@master ~] # kubectl get pods -l app=v1 NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-7f56b875dc-6zbjt 1 /1 Running 0 4h55m |
8. 通过标签删除服务
1 | kubectl delete service -l run=kubernetes-bootcamp |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
2016-01-25 Websphere停止服务不用输入账号密码