更新 Kubernetes 服务端点 IP
Update Kubernetes Service Endpoint IP
我将 Kubernetes 应用程序与具有单个端点的服务一起使用。如果使用 curl
我检索它,我得到这样的东西:
{
"kind": "Endpoints",
"apiVersion": "v1",
"metadata": {
...
"subsets": [
{
"addresses": [
{
"ip": "172.16.235.204"
}
],
...
}
]
现在在特定情况下,我的应用程序需要使用 curl PATCH 更改其 IP。我正在使用以下代码:
KUBE_SERVICE_DIR="/var/run/secrets/kubernetes.io/serviceaccount"
KUBE_TOKEN_FILENAME="${KUBE_SERVICE_DIR}/token"
KUBE_CA_CERT="${KUBE_SERVICE_DIR}/ca.crt"
KUBE_TOKEN=$(cat ${KUBE_TOKEN_FILENAME})
BODY='[{"op": "replace", "path": "subsets/0/addresses/0/ip", "value": "172.16.140.18"}]'
curl -XPATCH --cacert ${KUBE_CA_CERT} -H "Content-Type: application/json-patch+json" -H "Authorization: Bearer ${KUBE_TOKEN}" --data "${BODY}" "https://${KUBERNETES_API_HOST}:${KUBERNETES_API_PORT}/api/v1/namespaces/cf-db/endpoints/cfdb-ccdb"
如您所见,我的补丁 JSON 正在尝试在此路径上应用替换操作 subsets/0/addresses/0/ip
设置新 IP。
但是当我 运行 它时,我得到了:
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "the server rejected our request due to an error in our request",
"reason": "Invalid",
"details": {
},
"code": 422
有人可以帮我弄清楚我的代码有什么问题吗?我还使用 Whosebug 上的示例尝试了很多变体,但没有成功。
经过多次尝试和错误,我找到了以下解决方案。
类似这样的解决方案在 Patroni 中使用(但在 Python 中有写),其中服务有一个始终引用主节点的端点。当发生故障转移或切换时,Patroni 代码更新服务端点。每当您拥有 StatefulSet 并且即使在故障转移场景中也始终希望服务引用主节点时,都可以使用这样的代码。
KUBE_SERVICE_DIR="/var/run/secrets/kubernetes.io/serviceaccount"
KUBE_TOKEN_FILENAME="${KUBE_SERVICE_DIR}/token"
KUBE_CA_CERT="${KUBE_SERVICE_DIR}/ca.crt"
KUBE_TOKEN=$(cat ${KUBE_TOKEN_FILENAME})
KUBERNETES_API_HOST=${KUBERNETES_SERVICE_HOST}
KUBERNETES_API_PORT=${KUBERNETES_SERVICE_PORT}
generatePatchData()
{
local MASTER_IP=
local MASTER_PORT=
cat <<EOF
{"subsets": [{"addresses": [{"ip": "$MASTER_IP"}], "ports": [{"name": "postgresql", "port": $MASTER_PORT, "protocol": "TCP"}]}]}
EOF
}
patchEndpointIP() {
local MASTER_IP=
local MASTER_PORT=
curl -XPATCH --cacert ${KUBE_CA_CERT} -H "Content-Type: application/merge-patch+json" -H "Authorization: Bearer ${KUBE_TOKEN}" "https://${KUBERNETES_API_HOST}:${K
UBERNETES_API_PORT}/api/v1/namespaces/cf-db/endpoints/cfdb-ccdb" --data "$(generatePatchData $MASTER_IP $MASTER_PORT)"
}
getEndpointIP() {
curl -sSk -H "Authorization: Bearer ${KUBE_TOKEN}" "https://${KUBERNETES_API_HOST}:${KUBERNETES_API_PORT}/api/v1/namespaces/cf-db/endpoints/cfdb-ccdb"
}
patchEndpointIP "172.16.140.13" "5431"
getEndpointIP
我将 Kubernetes 应用程序与具有单个端点的服务一起使用。如果使用 curl
我检索它,我得到这样的东西:
{
"kind": "Endpoints",
"apiVersion": "v1",
"metadata": {
...
"subsets": [
{
"addresses": [
{
"ip": "172.16.235.204"
}
],
...
}
]
现在在特定情况下,我的应用程序需要使用 curl PATCH 更改其 IP。我正在使用以下代码:
KUBE_SERVICE_DIR="/var/run/secrets/kubernetes.io/serviceaccount"
KUBE_TOKEN_FILENAME="${KUBE_SERVICE_DIR}/token"
KUBE_CA_CERT="${KUBE_SERVICE_DIR}/ca.crt"
KUBE_TOKEN=$(cat ${KUBE_TOKEN_FILENAME})
BODY='[{"op": "replace", "path": "subsets/0/addresses/0/ip", "value": "172.16.140.18"}]'
curl -XPATCH --cacert ${KUBE_CA_CERT} -H "Content-Type: application/json-patch+json" -H "Authorization: Bearer ${KUBE_TOKEN}" --data "${BODY}" "https://${KUBERNETES_API_HOST}:${KUBERNETES_API_PORT}/api/v1/namespaces/cf-db/endpoints/cfdb-ccdb"
如您所见,我的补丁 JSON 正在尝试在此路径上应用替换操作 subsets/0/addresses/0/ip
设置新 IP。
但是当我 运行 它时,我得到了:
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "the server rejected our request due to an error in our request",
"reason": "Invalid",
"details": {
},
"code": 422
有人可以帮我弄清楚我的代码有什么问题吗?我还使用 Whosebug 上的示例尝试了很多变体,但没有成功。
经过多次尝试和错误,我找到了以下解决方案。
类似这样的解决方案在 Patroni 中使用(但在 Python 中有写),其中服务有一个始终引用主节点的端点。当发生故障转移或切换时,Patroni 代码更新服务端点。每当您拥有 StatefulSet 并且即使在故障转移场景中也始终希望服务引用主节点时,都可以使用这样的代码。
KUBE_SERVICE_DIR="/var/run/secrets/kubernetes.io/serviceaccount"
KUBE_TOKEN_FILENAME="${KUBE_SERVICE_DIR}/token"
KUBE_CA_CERT="${KUBE_SERVICE_DIR}/ca.crt"
KUBE_TOKEN=$(cat ${KUBE_TOKEN_FILENAME})
KUBERNETES_API_HOST=${KUBERNETES_SERVICE_HOST}
KUBERNETES_API_PORT=${KUBERNETES_SERVICE_PORT}
generatePatchData()
{
local MASTER_IP=
local MASTER_PORT=
cat <<EOF
{"subsets": [{"addresses": [{"ip": "$MASTER_IP"}], "ports": [{"name": "postgresql", "port": $MASTER_PORT, "protocol": "TCP"}]}]}
EOF
}
patchEndpointIP() {
local MASTER_IP=
local MASTER_PORT=
curl -XPATCH --cacert ${KUBE_CA_CERT} -H "Content-Type: application/merge-patch+json" -H "Authorization: Bearer ${KUBE_TOKEN}" "https://${KUBERNETES_API_HOST}:${K
UBERNETES_API_PORT}/api/v1/namespaces/cf-db/endpoints/cfdb-ccdb" --data "$(generatePatchData $MASTER_IP $MASTER_PORT)"
}
getEndpointIP() {
curl -sSk -H "Authorization: Bearer ${KUBE_TOKEN}" "https://${KUBERNETES_API_HOST}:${KUBERNETES_API_PORT}/api/v1/namespaces/cf-db/endpoints/cfdb-ccdb"
}
patchEndpointIP "172.16.140.13" "5431"
getEndpointIP