K8S部署服务以及服务的暴露

本文详细介绍了如何在Kubernetes中创建、管理应用,包括部署、查看资源、服务暴露、删除操作,以及Ingress的部署、规则配置和路由控制。重点讲解了NodePort、LoadBalancer和Ingress三种服务暴露方式及Ingress-Nginx的部署和规则设置。

基础命令:

1. 创建应用:
kubectl create deployment nginx-test --image=nginx
# 到远程仓库pull一个nginx的docker镜像
# 然后回创建一个名字为nginx-test的deployment
# 同时回创建一个pod

2. 查看pod:
kubectl get pods [-n namespace] [-A]
# 查看对应命名空间的 pod,默认命名空间是default
# -A 查看所有的pods

3. 查看deployment:
kubectl get deployment [-n namespace]
# 查看对应命名空间的 deployment,默认是default

4. 查看service:
kubectl get service [-n namespace]
# 查看对应命名空间的service

查看某个命名空间下的所有信息:
kubectl get all -n namespace

5. 暴露服务:
kubectl expose deployment nginx-test --port=80 [--type=NodePort]
# 暴露一个服务,K8S集群之间容器通信的端口是80,
# --type=NodePort,表示在集群部署的主机(所有主机)上开启一个随机的端口(默认30000~32767),暴露给外部使用, 可以通过 --nodePort指定一个固定的端口
# 执行这条命令之后才会产生一个 service
# 可以可以使用yaml文件的形式,创建服务之后直接暴露

6. 删除pod:
kubectl delete pod podName [-n namespace]
# 删除对应命名空间下名字为 podName的pod

7. 删除service:
kubectl delete service serviceName [-n namespace]
# 删除对应命名空间下名字为 serviceName的service

8. 删除:deployment
kubectl delete deployment deploymentName [-n namespace]
# 删除对应命名空间下名字为 deploymentName的deployment

# 删除某个命名空间下的所有内容
kubectl delete all all -n namespace

# 删除命名空间
kubectl delete  namespace name

9. 空部署测试:
kubectl create deployment 应用名 --image=镜像名 --dry-run=client [-o yaml > deploy.yaml ] 
# 不会真正的运行,会产生一个yaml文件

10. 通过yaml文件部署应用:
kubectl apply -f deploy.yaml
# apply 如果存在则更新,如果不存在则创建
# 推荐使用这种方式部署服务,自定义程度比较高

# create deployment默认是到配置的docker仓库pull镜像
# 如果使用本地镜像,需要修改deploy.yaml文件中的内容,如下
containers:
  - name: myweb
    image: myweb-image
    imagePullPolicy: Never		# 表示不到远程仓库拉取镜像

11. 编辑某个service
kubectl edit service kubernetes-dashboard -n kubernetes-dashboard

K8S集群中的三种端口:

1. nodePort:
集群提供给外部访问使用的端口。

2. port:
集群内部各个服务(容器)之间访问的端口,不提供给外部使用。

3. targetPort
容器自己的端口,这个端口一般和容器内部部署的应用端口相同,例如mysql 3306,nginx 80等等

K8S集群暴露服务的几种方式:

按照个人理解做了简单的描述,
https://blog.youkuaiyun.com/qq_21187515/article/details/112363072
感觉这个大佬写的很详细了

1. NodePort:
在集群的每一台机器上都开放一个端口,外部请求访问这个端口,然后转发个对应的pod

2. LoadBalancer
一般是需要云厂商提供的ip

3. Ingress:
可以理解成一个路由,访问对应的url时,ingress会将url解析成ip+端口

ingress-nginx暴露服务:

以暴露一个nginx服务为例子,

kubectl create deployment nginx --image=nginx		# 创建一个deploy
kubectl expose deployment nginx --port=80		# 暴露服务(创建一个service),这个端口在之后的rule.yaml中会用到,不需要指定--type=NodePort

在这里插入图片描述

安装ingress-nginx:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

# 补充一下,修改一下deploy.yaml这个文件里面的镜像,
# 320行添加 hostNetwork: true,否则无法访问
# 323行,改为阿里云的镜像,不然可能会安装失败
# registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:版本号

kubectl apply -f deploy.yaml

在这里插入图片描述

编写一个简单的路由规则:
ingress-nginx-rule.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-ingress			# 自定义
spec:
  rules:
  - host: www.sda1-hacker.com		# 自定义路由
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: nginx     # service名字 kubectl get service可以查看
            port: 
              number: 80    # service端口 -- 集群内部的端口,在 expose命令中指明的port=80,kubectl get service可以查看
	
	
	创建一个ingress规则:
	kubectl apply -f ingress-nginx-rule.yaml

	kubectl get ingress	# 获取ingress信息
	kubectl delete ingress name # 删除对应的ingress

在这里插入图片描述

# 在hosts配置一下映射   192.168.157.138 www.sda1-hacker.com

在这里插入图片描述

通过ip+端口号无法访问	

在这里插入图片描述

ok了,
扩容和缩容,可以通过副本数来控制,执行 kubectl apply -f xxx.yml即可
关于新加入worknode的配置,要使用DaemonSet控制器,看到了大佬们写的内容,还有其它一些控制器,等用到了再做笔记

# K8S 五种控制器类型
# https://blog.youkuaiyun.com/weixin_45691464/article/details/106326605

参考:
k8s-(七)暴露服务的三种方式
ingress-nginx详解和部署方案

<think> 我们正在讨论Kubernetes(k8s)中部署服务的命令。根据用户需求,我们需要提供在Kubernetes中部署服务时常用的命令。 在Kubernetes中,部署服务通常涉及以下几个步骤: 1. 创建Deployment部署)资源:用于部署应用程序的Pod副本。 2. 创建Service(服务)资源:用于暴露Deployment,使得应用程序可以被访问。 常用的命令如下: 1. 创建资源(Deployment、Service等): ```bash kubectl apply -f <配置文件> ``` 例如,如果有一个名为`deployment.yaml`的配置文件,则命令为: ```bash kubectl apply -f deployment.yaml ``` 2. 查看资源状态: - 查看Deployment: ```bash kubectl get deployments ``` - 查看Service: ```bash kubectl get services ``` - 查看Pod: ```bash kubectl get pods ``` 3. 暴露Deployment(创建Service): - 使用命令行直接创建Service来暴露Deployment: ```bash kubectl expose deployment <deployment名称> --type=<服务类型> --port=<端口号> ``` 其中,`<服务类型>`可以是`ClusterIP`(默认)、`NodePort`、`LoadBalancer`等。 例如,将名为`my-app`的deployment暴露NodePort类型的服务,端口为80: ```bash kubectl expose deployment my-app --type=NodePort --port=80 ``` 4. 更新部署: 当配置文件修改后,重新应用配置文件: ```bash kubectl apply -f <配置文件> ``` 5. 删除资源: ```bash kubectl delete -f <配置文件> ``` 或者通过指定资源类型和名称删除: ```bash kubectl delete deployment <deployment名称> kubectl delete service <service名称> ``` 6. 查看部署的详细信息: ```bash kubectl describe deployment <deployment名称> kubectl describe service <service名称> ``` 7. 查看Pod日志(用于调试): ```bash kubectl logs <pod名称> ``` 8. 进入Pod中的容器(用于调试): ```bash kubectl exec -it <pod名称> -- /bin/bash ``` 注意:在实际使用中,通常我们会编写YAML配置文件来定义Deployment和Service,然后使用`kubectl apply`命令来创建或更新资源。 例如,一个简单的Deployment配置文件(deployment.yaml)可能如下所示: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 ``` 一个Service配置文件(service.yaml)可能如下: ```yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort ``` 然后,我们可以分别应用这两个配置文件: ```bash kubectl apply -f deployment.yaml kubectl apply -f service.yaml ``` 这样,我们就部署了一个具有3个副本的Nginx应用,并通过NodePort类型的Service暴露服务。 以上就是在Kubernetes中部署服务时常用的命令和步骤。 相关问题: 1. 如何编写Kubernetes的Deployment配置文件? 2. Kubernetes的Service类型有哪些?它们之间有什么区别? 3. 如何扩展Kubernetes部署的副本数量? 4. 如何更新Kubernetes中的容器镜像? </think> 在 Kubernetes (K8s) 中部署服务主要涉及以下核心命令和操作步骤: ### 1. 核心部署命令 ```bash # 应用YAML配置文件创建资源(常用) kubectl apply -f <配置文件.yaml> # 示例:部署Deployment和Service kubectl apply -f deployment.yaml kubectl apply -f service.yaml ``` ### 2. 部署流程与关键命令 #### (1) 创建部署Deployment) ```bash # 创建Deployment(使用配置文件) kubectl create deployment <部署名> --image=<容器镜像> -o yaml > deployment.yaml kubectl apply -f deployment.yaml # 直接创建Deployment(简单场景) kubectl create deployment nginx --image=nginx:1.23 ``` #### (2) 暴露服务(Service) ```bash # 将Deployment暴露为Service kubectl expose deployment <部署名> \ --port=<服务端口> \ --target-port=<容器端口> \ --type=<服务类型> # ClusterIP/NodePort/LoadBalancer # 示例:创建NodePort服务 kubectl expose deployment nginx --port=80 --type=NodePort ``` #### (3) 验证部署状态 ```bash # 查看Deployment状态 kubectl get deployments # 查看Pod运行状态 kubectl get pods -o wide # 查看Service配置 kubectl get services # 查看详细描述 kubectl describe deployment <部署名> ``` ### 3. 配置文件示例 #### deployment.yaml ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.23 ports: - containerPort: 80 ``` #### service.yaml ```yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: NodePort # 外部可访问 ``` ### 4. 管理命令 ```bash # 扩展副本数量 kubectl scale deployment <部署名> --replicas=5 # 滚动更新镜像 kubectl set image deployment/<部署名> <容器名>=<新镜像>:<版本> # 删除部署 kubectl delete deployment <部署名> kubectl delete service <服务名> ``` ### 5. 调试命令 ```bash # 查看Pod日志 kubectl logs <pod名称> # 进入Pod容器 kubectl exec -it <pod名称> -- /bin/bash # 查看集群事件 kubectl get events --sort-by=.metadata.creationTimestamp ``` > **最佳实践**:推荐使用声明式配置(YAML文件)进行部署,便于版本控制和重复部署[^2]。本地测试时可使用 `minikube` 或 `kind` 搭建集群[^1],生产环境建议使用托管服务如 GKE/EKS/AKS[^4]。 --- ### 相关问题 1. Kubernetes 中 Deployment 和 StatefulSet 有什么区别? 2. 如何配置 Kubernetes 服务的网络策略? 3. Kubernetes 的 ConfigMap 和 Secret 如何使用? 4. 如何实现 Kubernetes 的自动扩缩容(HPA)?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值