一、需求背景
存在以下三台服务器:192.168.1.7(master)、192.168.1.8(node 1)、 192.168.1.9(node 2)
在三台服务器组成nginx集群。
二、配置环境
查看k8s版本信息: kubectl version
[root@jdnode-2 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.6", GitCommit:"ad3338546da947756e8a88aa6822e9c11e7eac22", GitTreeState:"clean", BuildDate:"2022-04-14T08:49:13Z", GoVersion:"go1.17.9", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
查看docker 版本信息:
docker version 24.0.5
三、创建集群
1、vim my_nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 3
template:
metadata:
labels:
run: my-nginx
spec:
containers:
image: nginx
ports:
这是一个 Kubernetes 的 YAML 配置文件,用于定义一个 Deployment,该 Deployment 将运行名为 "my-nginx" 的 Nginx 容器,并在集群中创建三个 Pod 副本。
关键部分如下:
apiVersion: apps/v1
: 表示使用的 Kubernetes API 版本,这里是 Apps API 的版本。kind: Deployment
: 声明这是一个 Deployment 对象。metadata
: 包含 Deployment 的元数据信息,其中name
字段指定了 Deployment 的名称为 "my-nginx"。spec
: 定义 Deployment 的规范。metadata
: 包含 Pod 的元数据信息,其中labels
字段指定了标签为 "run: my-nginx"。spec
: 定义了 Pod 的规范。name: my-nginx
: 容器的名称。image: nginx
: 容器所使用的 Docker 镜像为 Nginx。ports
: 容器暴露的端口配置,这里将容器的 80 端口映射到集群中。containers
: 描述了 Pod 中运行的容器。selector
: 用于选择将在其中运行 Pod 的标签。replicas: 3
: 指定要创建的 Pod 副本数为 3。template
: 定义了创建 Pod 所需的模板。
这个 Deployment 文件的效果是在 Kubernetes 集群中创建一个名为 "my-nginx" 的 Deployment,该 Deployment 管理着三个运行 Nginx 容器的 Pod 副本。
kubectl apply -f my_nginx.yaml #启动
[root@jdmaster k8s]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx-cf54cdbf7-9qh74 1/1 Running 0 13m
my-nginx-cf54cdbf7-b9ptd 1/1 Running 0 13m
my-nginx-cf54cdbf7-m4ppl 1/1 Running 0 13m
2、vim my_service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort
ports:
targetPort: 80
protocol: TCP
name: http
selector:
run: my-nginx
这是一个 Kubernetes 的 YAML 配置文件,用于定义一个 Service,该 Service 将与前面定义的 Deployment 关联,允许外部流量访问这个 Deployment。
关键部分如下:
apiVersion: v1
: 表示使用的 Kubernetes API 版本。kind: Service
: 声明这是一个 Service 对象。metadata
: 包含 Service 的元数据信息,其中name
字段指定了 Service 的名称为 "my-nginx",同时还为 Service 打了一个标签 "run: my-nginx"。spec
: 定义 Service 的规范。run: my-nginx
: 选择具有标签 "run: my-nginx" 的 Pod。port: 8080
: 指定外部访问的端口。targetPort: 80
: 将请求转发到后端 Pod 的端口。protocol: TCP
: 指定通信协议为 TCP。name: http
: 定义了端口的名称。type: NodePort
: 指定 Service 类型为 NodePort,这意味着 Service 将暴露一个随机选择的端口,并将请求路由到后端 Pod。ports
: 定义了 Service 暴露的端口配置。selector
: 用于选择将接收流量的后端 Pod 的标签。
这个 Service 文件的效果是创建了一个 NodePort 类型的 Service,名称为 "my-nginx",它将外部流量通过节点的某个随机端口转发到后端运行 Nginx 的 Pod。
kubectl apply -f my_service.yaml #启动服务
kubectl get svc #查看状态
[root@jdmaster k8s]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 443/TCP 3h24m
my-nginx NodePort 10.1.173.180 8080:31756/TCP 17m
Kubernetes Service my-nginx
已经成功创建,并且是一个 NodePort 类型的服务。以下是输出中各字段的解释:
NAME: Service 的名称,这里是
my-nginx
。TYPE: Service 的类型,这里是
NodePort
,表示这是一个 NodePort 类型的服务。CLUSTER-IP: Service 的 Cluster IP 地址,这个 IP 地址只在集群内部可用。
EXTERNAL-IP: 外部 IP 地址。在这里是
,因为NodePort服务通常不会分配外部 IP,而是通过节点上的某个端口提供对服务的外部访问。
PORT(S): Service 暴露的端口。在这里是
8080:31756/TCP
,表示 Service 将外部流量引导到节点上的端口31756
,而这个端口会映射到 Pod 的端口8080
。AGE: Service 创建后经过的时间。
如果想通过集群的节点 IP 和 NodePort 访问 Nginx 服务,你可以使用 :31756
,其中 是你集群中某个节点的 IP 地址。例如,如果你的集群中有一个节点的 IP 地址是
192.168.1.7
,可以通过 http://192.168.1.7:31756
访问 Nginx 服务。NodePort 是随机选择的,因此端口号可能会有所不同。
自定义端口nodePort
Kubernetes 的nodePort
应该在 30000 到 32767 的范围内。
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort
ports:
targetPort: 80
nodePort: 30888
protocol: TCP
name: http
selector:
run: my-nginx
[
The Service "my-nginx" is invalid: spec.ports[0].nodePort: Invalid value: 32780: provided port is not in the valid range. The range of valid ports is 30000-32767
外部通过IP地址:nodePort进行访问。
希望该内容能对读者有所帮助,欢迎扫描下方二维码关注本号,更多内容持续更新中。