mirror of https://github.com/linkerd/linkerd2.git
feat(inject): Support arbitrary proxy parameters from helm (#12493)
New proxy HTTP2 server parameters can be configured from the environment. These environment variables take the form: LINKERD2_PROXY_[INBOUND|OUTBOUND]_[SERVER]_[HTTP2]_<PARAM> We want to allow these parameters to be set, i.e., in a values.yaml file without having to document all of the possible parameters (especially those that primarily influence internals not exposed to the application). To accomodate this, this commit introduces generic proxy environment templating and a test to verify the behavior. Values like the following: proxy: inbound: scope: proto: blueberryPi: 3.14 outbound: scope: proto: applesauce: "valueA" Manifest as a proxy environment including: LINKERD2_PROXY_INBOUND_SCOPE_PROTO_BLUEBERRY_PI="3.14" LINKERD2_PROXY_OUTBOUND_SCOPE_PROTO_APPLESAUCE=valueA That is, Helm value keys are converted to SCREAMING_SNAKE_CASE environment variable names.
This commit is contained in:
parent
7545d131cb
commit
9e241a74d6
|
@ -104,6 +104,17 @@ env:
|
||||||
value: 10000ms
|
value: 10000ms
|
||||||
- name: LINKERD2_PROXY_OUTBOUND_CONNECT_KEEPALIVE
|
- name: LINKERD2_PROXY_OUTBOUND_CONNECT_KEEPALIVE
|
||||||
value: 10000ms
|
value: 10000ms
|
||||||
|
{{- /* Configure inbound and outbound parameters, e.g. for HTTP/2 servers. */}}
|
||||||
|
{{ range $proxyK, $proxyV := (dict "inbound" .Values.proxy.inbound "outbound" .Values.proxy.outbound) -}}
|
||||||
|
{{ range $scopeK, $scopeV := $proxyV -}}
|
||||||
|
{{ range $protoK, $protoV := $scopeV -}}
|
||||||
|
{{ range $paramK, $paramV := $protoV -}}
|
||||||
|
- name: LINKERD2_PROXY_{{snakecase $proxyK | upper}}_{{snakecase $scopeK | upper}}_{{snakecase $protoK | upper}}_{{snakecase $paramK | upper}}
|
||||||
|
value: {{ quote $paramV }}
|
||||||
|
{{ end -}}
|
||||||
|
{{ end -}}
|
||||||
|
{{ end -}}
|
||||||
|
{{ end -}}
|
||||||
{{ if .Values.proxy.opaquePorts -}}
|
{{ if .Values.proxy.opaquePorts -}}
|
||||||
- name: LINKERD2_PROXY_INBOUND_PORTS_DISABLE_PROTOCOL_DETECTION
|
- name: LINKERD2_PROXY_INBOUND_PORTS_DISABLE_PROTOCOL_DETECTION
|
||||||
value: {{.Values.proxy.opaquePorts | quote}}
|
value: {{.Values.proxy.opaquePorts | quote}}
|
||||||
|
|
|
@ -357,6 +357,32 @@ func TestUninjectAndInject(t *testing.T) {
|
||||||
return values
|
return values
|
||||||
}(),
|
}(),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
inputFileName: "inject_emojivoto_deployment.input.yml",
|
||||||
|
goldenFileName: "inject_emojivoto_deployment_params.golden.yml",
|
||||||
|
reportFileName: "inject_emojivoto_deployment.report",
|
||||||
|
injectProxy: true,
|
||||||
|
testInjectConfig: func() *linkerd2.Values {
|
||||||
|
values := defaultConfig()
|
||||||
|
values.Proxy.Inbound = linkerd2.ProxyParams{
|
||||||
|
"scope": linkerd2.ProxyScopeParams{
|
||||||
|
"proto": linkerd2.ProxyProtoParams{
|
||||||
|
"appleSauce": "valueA",
|
||||||
|
"blueberry": 3.14,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
values.Proxy.Outbound = linkerd2.ProxyParams{
|
||||||
|
"scope": linkerd2.ProxyScopeParams{
|
||||||
|
"proto": linkerd2.ProxyProtoParams{
|
||||||
|
"applesauce": "valueA",
|
||||||
|
"blueBerry": true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return values
|
||||||
|
}(),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, tc := range testCases {
|
for i, tc := range testCases {
|
||||||
|
@ -382,6 +408,8 @@ type injectCmd struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testInjectCmd(t *testing.T, tc injectCmd) {
|
func testInjectCmd(t *testing.T, tc injectCmd) {
|
||||||
|
t.Helper()
|
||||||
|
|
||||||
testConfig := tc.values
|
testConfig := tc.values
|
||||||
if testConfig == nil {
|
if testConfig == nil {
|
||||||
var err error
|
var err error
|
||||||
|
|
|
@ -0,0 +1,242 @@
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: web
|
||||||
|
namespace: emojivoto
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: web-svc
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
linkerd.io/created-by: linkerd/cli dev-undefined
|
||||||
|
linkerd.io/proxy-version: test-inject-proxy-version
|
||||||
|
linkerd.io/trust-root-sha256: 8dc603abd4e755c25c94da05abbf29b9b283a784733651020d72f97ca8ab98e4
|
||||||
|
labels:
|
||||||
|
app: web-svc
|
||||||
|
linkerd.io/control-plane-ns: linkerd
|
||||||
|
linkerd.io/proxy-deployment: web
|
||||||
|
linkerd.io/workload-ns: emojivoto
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- env:
|
||||||
|
- name: _pod_name
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: _pod_ns
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
- name: _pod_nodeName
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
- name: LINKERD2_PROXY_LOG
|
||||||
|
value: warn,linkerd=info,trust_dns=error
|
||||||
|
- name: LINKERD2_PROXY_LOG_FORMAT
|
||||||
|
value: plain
|
||||||
|
- name: LINKERD2_PROXY_DESTINATION_SVC_ADDR
|
||||||
|
value: linkerd-dst-headless.linkerd.svc.cluster.local.:8086
|
||||||
|
- name: LINKERD2_PROXY_DESTINATION_PROFILE_NETWORKS
|
||||||
|
value: 10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16,fd00::/8
|
||||||
|
- name: LINKERD2_PROXY_POLICY_SVC_ADDR
|
||||||
|
value: linkerd-policy.linkerd.svc.cluster.local.:8090
|
||||||
|
- name: LINKERD2_PROXY_POLICY_WORKLOAD
|
||||||
|
value: |
|
||||||
|
{"ns":"$(_pod_ns)", "pod":"$(_pod_name)"}
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_DEFAULT_POLICY
|
||||||
|
value: all-unauthenticated
|
||||||
|
- name: LINKERD2_PROXY_POLICY_CLUSTER_NETWORKS
|
||||||
|
value: 10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16,fd00::/8
|
||||||
|
- name: LINKERD2_PROXY_CONTROL_STREAM_INITIAL_TIMEOUT
|
||||||
|
value: 3s
|
||||||
|
- name: LINKERD2_PROXY_CONTROL_STREAM_IDLE_TIMEOUT
|
||||||
|
value: 5m
|
||||||
|
- name: LINKERD2_PROXY_CONTROL_STREAM_LIFETIME
|
||||||
|
value: 1h
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_CONNECT_TIMEOUT
|
||||||
|
value: 100ms
|
||||||
|
- name: LINKERD2_PROXY_OUTBOUND_CONNECT_TIMEOUT
|
||||||
|
value: 1000ms
|
||||||
|
- name: LINKERD2_PROXY_OUTBOUND_DISCOVERY_IDLE_TIMEOUT
|
||||||
|
value: 5s
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_DISCOVERY_IDLE_TIMEOUT
|
||||||
|
value: 90s
|
||||||
|
- name: LINKERD2_PROXY_CONTROL_LISTEN_ADDR
|
||||||
|
value: 0.0.0.0:4190
|
||||||
|
- name: LINKERD2_PROXY_ADMIN_LISTEN_ADDR
|
||||||
|
value: 0.0.0.0:4191
|
||||||
|
- name: LINKERD2_PROXY_OUTBOUND_LISTEN_ADDR
|
||||||
|
value: 127.0.0.1:4140
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_LISTEN_ADDR
|
||||||
|
value: 0.0.0.0:4143
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_IPS
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: status.podIPs
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_PORTS
|
||||||
|
value: "80"
|
||||||
|
- name: LINKERD2_PROXY_DESTINATION_PROFILE_SUFFIXES
|
||||||
|
value: svc.cluster.local.
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_ACCEPT_KEEPALIVE
|
||||||
|
value: 10000ms
|
||||||
|
- name: LINKERD2_PROXY_OUTBOUND_CONNECT_KEEPALIVE
|
||||||
|
value: 10000ms
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_SCOPE_PROTO_APPLE_SAUCE
|
||||||
|
value: valueA
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_SCOPE_PROTO_BLUEBERRY
|
||||||
|
value: "3.14"
|
||||||
|
- name: LINKERD2_PROXY_OUTBOUND_SCOPE_PROTO_APPLESAUCE
|
||||||
|
value: valueA
|
||||||
|
- name: LINKERD2_PROXY_OUTBOUND_SCOPE_PROTO_BLUE_BERRY
|
||||||
|
value: "true"
|
||||||
|
- name: LINKERD2_PROXY_INBOUND_PORTS_DISABLE_PROTOCOL_DETECTION
|
||||||
|
value: 25,587,3306,4444,5432,6379,9300,11211
|
||||||
|
- name: LINKERD2_PROXY_DESTINATION_CONTEXT
|
||||||
|
value: |
|
||||||
|
{"ns":"$(_pod_ns)", "nodeName":"$(_pod_nodeName)", "pod":"$(_pod_name)"}
|
||||||
|
- name: _pod_sa
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.serviceAccountName
|
||||||
|
- name: _l5d_ns
|
||||||
|
value: linkerd
|
||||||
|
- name: _l5d_trustdomain
|
||||||
|
value: cluster.local
|
||||||
|
- name: LINKERD2_PROXY_IDENTITY_DIR
|
||||||
|
value: /var/run/linkerd/identity/end-entity
|
||||||
|
- name: LINKERD2_PROXY_IDENTITY_TRUST_ANCHORS
|
||||||
|
value: |
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIBwTCCAWagAwIBAgIQeDZp5lDaIygQ5UfMKZrFATAKBggqhkjOPQQDAjApMScw
|
||||||
|
JQYDVQQDEx5pZGVudGl0eS5saW5rZXJkLmNsdXN0ZXIubG9jYWwwHhcNMjAwODI4
|
||||||
|
MDcxMjQ3WhcNMzAwODI2MDcxMjQ3WjApMScwJQYDVQQDEx5pZGVudGl0eS5saW5r
|
||||||
|
ZXJkLmNsdXN0ZXIubG9jYWwwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARqc70Z
|
||||||
|
l1vgw79rjB5uSITICUA6GyfvSFfcuIis7B/XFSkkwAHU5S/s1AAP+R0TX7HBWUC4
|
||||||
|
uaG4WWsiwJKNn7mgo3AwbjAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB
|
||||||
|
/wIBATAdBgNVHQ4EFgQU5YtjVVPfd7I7NLHsn2C26EByGV0wKQYDVR0RBCIwIIIe
|
||||||
|
aWRlbnRpdHkubGlua2VyZC5jbHVzdGVyLmxvY2FsMAoGCCqGSM49BAMCA0kAMEYC
|
||||||
|
IQCN7lBFLDDvjx6V0+XkjpKERRsJYf5adMvnloFl48ilJgIhANtxhndcr+QJPuC8
|
||||||
|
vgUC0d2/9FMueIVMb+46WTCOjsqr
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
- name: LINKERD2_PROXY_IDENTITY_TOKEN_FILE
|
||||||
|
value: /var/run/secrets/tokens/linkerd-identity-token
|
||||||
|
- name: LINKERD2_PROXY_IDENTITY_SVC_ADDR
|
||||||
|
value: linkerd-identity-headless.linkerd.svc.cluster.local.:8080
|
||||||
|
- name: LINKERD2_PROXY_IDENTITY_LOCAL_NAME
|
||||||
|
value: $(_pod_sa).$(_pod_ns).serviceaccount.identity.linkerd.cluster.local
|
||||||
|
- name: LINKERD2_PROXY_IDENTITY_SVC_NAME
|
||||||
|
value: linkerd-identity.linkerd.serviceaccount.identity.linkerd.cluster.local
|
||||||
|
- name: LINKERD2_PROXY_DESTINATION_SVC_NAME
|
||||||
|
value: linkerd-destination.linkerd.serviceaccount.identity.linkerd.cluster.local
|
||||||
|
- name: LINKERD2_PROXY_POLICY_SVC_NAME
|
||||||
|
value: linkerd-destination.linkerd.serviceaccount.identity.linkerd.cluster.local
|
||||||
|
image: cr.l5d.io/linkerd/proxy:test-inject-proxy-version
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
lifecycle:
|
||||||
|
postStart:
|
||||||
|
exec:
|
||||||
|
command:
|
||||||
|
- /usr/lib/linkerd/linkerd-await
|
||||||
|
- --timeout=2m
|
||||||
|
- --port=4191
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /live
|
||||||
|
port: 4191
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
timeoutSeconds: 1
|
||||||
|
name: linkerd-proxy
|
||||||
|
ports:
|
||||||
|
- containerPort: 4143
|
||||||
|
name: linkerd-proxy
|
||||||
|
- containerPort: 4191
|
||||||
|
name: linkerd-admin
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /ready
|
||||||
|
port: 4191
|
||||||
|
initialDelaySeconds: 2
|
||||||
|
timeoutSeconds: 1
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 2102
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
terminationMessagePolicy: FallbackToLogsOnError
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /var/run/linkerd/identity/end-entity
|
||||||
|
name: linkerd-identity-end-entity
|
||||||
|
- mountPath: /var/run/secrets/tokens
|
||||||
|
name: linkerd-identity-token
|
||||||
|
- env:
|
||||||
|
- name: WEB_PORT
|
||||||
|
value: "80"
|
||||||
|
- name: EMOJISVC_HOST
|
||||||
|
value: emoji-svc.emojivoto:8080
|
||||||
|
- name: VOTINGSVC_HOST
|
||||||
|
value: voting-svc.emojivoto:8080
|
||||||
|
- name: INDEX_BUNDLE
|
||||||
|
value: dist/index_bundle.js
|
||||||
|
image: buoyantio/emojivoto-web:v10
|
||||||
|
name: web-svc
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
name: http
|
||||||
|
initContainers:
|
||||||
|
- args:
|
||||||
|
- --incoming-proxy-port
|
||||||
|
- "4143"
|
||||||
|
- --outgoing-proxy-port
|
||||||
|
- "4140"
|
||||||
|
- --proxy-uid
|
||||||
|
- "2102"
|
||||||
|
- --inbound-ports-to-ignore
|
||||||
|
- 4190,4191,4567,4568
|
||||||
|
- --outbound-ports-to-ignore
|
||||||
|
- 4567,4568
|
||||||
|
image: cr.l5d.io/linkerd/proxy-init:v2.4.0
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
name: linkerd-init
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 20Mi
|
||||||
|
requests:
|
||||||
|
cpu: 100m
|
||||||
|
memory: 20Mi
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
add:
|
||||||
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
|
privileged: false
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 65534
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
terminationMessagePolicy: FallbackToLogsOnError
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /run
|
||||||
|
name: linkerd-proxy-init-xtables-lock
|
||||||
|
volumes:
|
||||||
|
- emptyDir: {}
|
||||||
|
name: linkerd-proxy-init-xtables-lock
|
||||||
|
- emptyDir:
|
||||||
|
medium: Memory
|
||||||
|
name: linkerd-identity-end-entity
|
||||||
|
- name: linkerd-identity-token
|
||||||
|
projected:
|
||||||
|
sources:
|
||||||
|
- serviceAccountToken:
|
||||||
|
audience: identity.l5d.io
|
||||||
|
expirationSeconds: 86400
|
||||||
|
path: linkerd-identity-token
|
||||||
|
---
|
|
@ -139,8 +139,15 @@ type (
|
||||||
|
|
||||||
AdditionalEnv []corev1.EnvVar `json:"additionalEnv"`
|
AdditionalEnv []corev1.EnvVar `json:"additionalEnv"`
|
||||||
ExperimentalEnv []corev1.EnvVar `json:"experimentalEnv"`
|
ExperimentalEnv []corev1.EnvVar `json:"experimentalEnv"`
|
||||||
|
|
||||||
|
Inbound ProxyParams `json:"inbound,omitempty"`
|
||||||
|
Outbound ProxyParams `json:"outbound,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProxyParams = map[string]ProxyScopeParams
|
||||||
|
ProxyScopeParams = map[string]ProxyProtoParams
|
||||||
|
ProxyProtoParams = map[string]interface{}
|
||||||
|
|
||||||
ProxyControl struct {
|
ProxyControl struct {
|
||||||
Streams *ProxyControlStreams `json:"streams"`
|
Streams *ProxyControlStreams `json:"streams"`
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue