K8s 服务的发布,ingress暴露服务

1,603 阅读4分钟

基础命令:

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 -n namespace

# 删除命名空间
kubectl delete  namespace name

9. 空部署测试:
kubectl create deployment 应用名 --image=镜像名 --dey-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.csdn.net/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.csdn.net/weixin_45691464/article/details/106326605

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