使用运算符框架负载平衡 K8s Pods
Load balancing K8s Pods with operator-framework
我通过调整 memcached 示例构建了一个简单的运算符。唯一的主要区别是我的 pods 中需要两张 docker 图片。获得部署 运行。我的 test.yaml 曾经使用 kubectl
进行部署。
apiVersion: "cache.example.com/v1alpha1"
kind: "Memcached"
metadata:
name: "solar-demo"
spec:
size: 3
group: cache.example.com
names:
kind: Memcached
listKind: MemcachedList
plural: solar-demos
singular: solar-demo
scope: Namespaced
version: v1alpha1
我仍然缺少一个部分——负载平衡部分。目前,在 Docker 下,我们使用 nginx
图像作为反向代理配置为:
upstream api_microservice {
server api:3000;
}
upstream solar-svc_microservice {
server solar-svc:3001;
}
server {
listen $NGINX_PORT default;
location /city {
proxy_pass http://api_microservice;
}
location /solar {
proxy_pass http://solar-svc_microservice;
}
root /html;
location / {
try_files /$uri /$uri/index.html /$uri.html /index.html=404;
}
}
我希望我的集群公开端口 8080
并将端口 3000
和 3001
转发到 Pods 内的图像 运行。
我的部署:
dep := &appsv1.Deployment{
TypeMeta: metav1.TypeMeta{
APIVersion: "apps/v1",
Kind: "Deployment",
},
ObjectMeta: metav1.ObjectMeta{
Name: m.Name,
Namespace: m.Namespace,
},
Spec: appsv1.DeploymentSpec{
Replicas: &replicas,
Selector: &metav1.LabelSelector{
MatchLabels: ls,
},
Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: ls,
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Image: "shmukler/docker_solar-svc",
Name: "solar-svc",
Command: []string{"npm", "run", "start-solar-svc"},
Ports: []v1.ContainerPort{{
ContainerPort: 3001,
Name: "solar-svc",
}},
},
{
Image: "shmukler/docker_solar-api",
Name: "api",
Command: []string{"npm", "run", "start-api"},
Ports: []v1.ContainerPort{{
ContainerPort: 3000,
Name: "solar-api",
}},
},
},
},
},
}
我需要在 pods 前面添加什么 ingress
或什么 运行?
谢谢
What do I need to add have ingress or something running in front of my pods?
是的,Ingress 专为此类任务而设计。
Ingress
有一个 path-based
路由,它将能够设置与您在使用 Nginx 的示例中提到的相同的配置。此外,Ingress
最流行的实现之一是 Nginx
作为代理。
Ingress
基本上是一组规则,允许流量(否则被丢弃或转发到其他地方)到达集群服务。
这是 Ingress 配置的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-app
spec:
rules:
- host: '' # Empty value means ‘any host’
http:
paths:
- path: /city
backend:
serviceName: myapp
servicePort: 3000
- path: /solar
backend:
serviceName: myapp
servicePort: 3001
此外,因为 Pod
不是静态的,您应该创建一个 Service
对象,它将成为 Ingress
.[=23 应用程序的静态入口点=]
这里是 Service
的例子:
kind: Service
apiVersion: v1
metadata:
name: myapp
spec:
selector:
app: "NAME_OF_YOUR_DEPLOYMENT"
ports:
- name: city
protocol: TCP
port: 3000
targetPort: 3000
- name: solar
protocol: TCP
port: 3001
targetPort: 3001
我通过调整 memcached 示例构建了一个简单的运算符。唯一的主要区别是我的 pods 中需要两张 docker 图片。获得部署 运行。我的 test.yaml 曾经使用 kubectl
进行部署。
apiVersion: "cache.example.com/v1alpha1"
kind: "Memcached"
metadata:
name: "solar-demo"
spec:
size: 3
group: cache.example.com
names:
kind: Memcached
listKind: MemcachedList
plural: solar-demos
singular: solar-demo
scope: Namespaced
version: v1alpha1
我仍然缺少一个部分——负载平衡部分。目前,在 Docker 下,我们使用 nginx
图像作为反向代理配置为:
upstream api_microservice {
server api:3000;
}
upstream solar-svc_microservice {
server solar-svc:3001;
}
server {
listen $NGINX_PORT default;
location /city {
proxy_pass http://api_microservice;
}
location /solar {
proxy_pass http://solar-svc_microservice;
}
root /html;
location / {
try_files /$uri /$uri/index.html /$uri.html /index.html=404;
}
}
我希望我的集群公开端口 8080
并将端口 3000
和 3001
转发到 Pods 内的图像 运行。
我的部署:
dep := &appsv1.Deployment{
TypeMeta: metav1.TypeMeta{
APIVersion: "apps/v1",
Kind: "Deployment",
},
ObjectMeta: metav1.ObjectMeta{
Name: m.Name,
Namespace: m.Namespace,
},
Spec: appsv1.DeploymentSpec{
Replicas: &replicas,
Selector: &metav1.LabelSelector{
MatchLabels: ls,
},
Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: ls,
},
Spec: v1.PodSpec{
Containers: []v1.Container{
{
Image: "shmukler/docker_solar-svc",
Name: "solar-svc",
Command: []string{"npm", "run", "start-solar-svc"},
Ports: []v1.ContainerPort{{
ContainerPort: 3001,
Name: "solar-svc",
}},
},
{
Image: "shmukler/docker_solar-api",
Name: "api",
Command: []string{"npm", "run", "start-api"},
Ports: []v1.ContainerPort{{
ContainerPort: 3000,
Name: "solar-api",
}},
},
},
},
},
}
我需要在 pods 前面添加什么 ingress
或什么 运行?
谢谢
What do I need to add have ingress or something running in front of my pods?
是的,Ingress 专为此类任务而设计。
Ingress
有一个 path-based
路由,它将能够设置与您在使用 Nginx 的示例中提到的相同的配置。此外,Ingress
最流行的实现之一是 Nginx
作为代理。
Ingress
基本上是一组规则,允许流量(否则被丢弃或转发到其他地方)到达集群服务。
这是 Ingress 配置的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-app
spec:
rules:
- host: '' # Empty value means ‘any host’
http:
paths:
- path: /city
backend:
serviceName: myapp
servicePort: 3000
- path: /solar
backend:
serviceName: myapp
servicePort: 3001
此外,因为 Pod
不是静态的,您应该创建一个 Service
对象,它将成为 Ingress
.[=23 应用程序的静态入口点=]
这里是 Service
的例子:
kind: Service
apiVersion: v1
metadata:
name: myapp
spec:
selector:
app: "NAME_OF_YOUR_DEPLOYMENT"
ports:
- name: city
protocol: TCP
port: 3000
targetPort: 3000
- name: solar
protocol: TCP
port: 3001
targetPort: 3001