디렉토리
기사에 의존 다음 작업
KUBE-apiserver 인증서 만들기
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
cat > kubernetes-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"10.0.20.10",
"10.0.20.11",
"10.0.20.12",
"10.0.20.13",
"vip.k8s.com",
"node01.k8s.com",
"node02.k8s.com",
"node03.k8s.com",
"10.254.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local."
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "4Paradigm"
}
]
}
EOF
#需要将集群的所有IP及VIP添域名加进去
#如果要添加注意最后的逗号,不要忘记添加,否则下一步报错
호스트 필드에 도메인 이름의 목록을 지정하고, IP가 여기에 IP 노드 마스터있는 인증서를 사용할 수있는 권한, IP 및 도메인 이름 서비스는 Kubernetes
는 Kubernetes serviceIP apiserver의 자동 네트워크 영역, 일반적으로 제 IP - 서비스 - 클러스터 IP 범위 파라미터 지정 만들어
$ kubectl get svc kubernetes
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 443/TCP 31d
인증서와 개인 키를 생성
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
cfssl gencert -ca=/opt/k8s/work/ca.pem \
-ca-key=/opt/k8s/work/ca-key.pem \
-config=/opt/k8s/work/ca-config.json \
-profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
ls kubernetes*pem
생성 된 인증서와 개인 키 파일은 모든 마스터 노드에 복사
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p /etc/kubernetes/cert"
scp kubernetes*.pem root@${node_ip}:/etc/kubernetes/cert/
done
암호화 된 구성 파일 만들기
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
cat > encryption-config.yaml <<EOF
kind: EncryptionConfig
apiVersion: v1
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: ${ENCRYPTION_KEY}
- identity: {}
EOF
구성 파일은 암호화 된 마스터 노드의 / etc /는 Kubernetes 디렉토리에 복사됩니다
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
scp encryption-config.yaml root@${node_ip}:/etc/kubernetes/
done
감사 정책 파일 만들기
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
cat > audit-policy.yaml <<EOF
apiVersion: audit.k8s.io/v1beta1
kind: Policy
rules:
# The following requests were manually identified as high-volume and low-risk, so drop them.
- level: None
resources:
- group: ""
resources:
- endpoints
- services
- services/status
users:
- 'system:kube-proxy'
verbs:
- watch
- level: None
resources:
- group: ""
resources:
- nodes
- nodes/status
userGroups:
- 'system:nodes'
verbs:
- get
- level: None
namespaces:
- kube-system
resources:
- group: ""
resources:
- endpoints
users:
- 'system:kube-controller-manager'
- 'system:kube-scheduler'
- 'system:serviceaccount:kube-system:endpoint-controller'
verbs:
- get
- update
- level: None
resources:
- group: ""
resources:
- namespaces
- namespaces/status
- namespaces/finalize
users:
- 'system:apiserver'
verbs:
- get
# Don't log HPA fetching metrics.
- level: None
resources:
- group: metrics.k8s.io
users:
- 'system:kube-controller-manager'
verbs:
- get
- list
# Don't log these read-only URLs.
- level: None
nonResourceURLs:
- '/healthz*'
- /version
- '/swagger*'
# Don't log events requests.
- level: None
resources:
- group: ""
resources:
- events
# node and pod status calls from nodes are high-volume and can be large, don't log responses for expected updates from nodes
- level: Request
omitStages:
- RequestReceived
resources:
- group: ""
resources:
- nodes/status
- pods/status
users:
- kubelet
- 'system:node-problem-detector'
- 'system:serviceaccount:kube-system:node-problem-detector'
verbs:
- update
- patch
- level: Request
omitStages:
- RequestReceived
resources:
- group: ""
resources:
- nodes/status
- pods/status
userGroups:
- 'system:nodes'
verbs:
- update
- patch
# deletecollection calls can be large, don't log responses for expected namespace deletions
- level: Request
omitStages:
- RequestReceived
users:
- 'system:serviceaccount:kube-system:namespace-controller'
verbs:
- deletecollection
# Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data,
# so only log at the Metadata level.
- level: Metadata
omitStages:
- RequestReceived
resources:
- group: ""
resources:
- secrets
- configmaps
- group: authentication.k8s.io
resources:
- tokenreviews
# Get repsonses can be large; skip them.
- level: Request
omitStages:
- RequestReceived
resources:
- group: ""
- group: admissionregistration.k8s.io
- group: apiextensions.k8s.io
- group: apiregistration.k8s.io
- group: apps
- group: authentication.k8s.io
- group: authorization.k8s.io
- group: autoscaling
- group: batch
- group: certificates.k8s.io
- group: extensions
- group: metrics.k8s.io
- group: networking.k8s.io
- group: policy
- group: rbac.authorization.k8s.io
- group: scheduling.k8s.io
- group: settings.k8s.io
- group: storage.k8s.io
verbs:
- get
- list
- watch
# Default level for known APIs
- level: RequestResponse
omitStages:
- RequestReceived
resources:
- group: ""
- group: admissionregistration.k8s.io
- group: apiextensions.k8s.io
- group: apiregistration.k8s.io
- group: apps
- group: authentication.k8s.io
- group: authorization.k8s.io
- group: autoscaling
- group: batch
- group: certificates.k8s.io
- group: extensions
- group: metrics.k8s.io
- group: networking.k8s.io
- group: policy
- group: rbac.authorization.k8s.io
- group: scheduling.k8s.io
- group: settings.k8s.io
- group: storage.k8s.io
# Default level for all other requests.
- level: Metadata
omitStages:
- RequestReceived
EOF
감사 정책 파일의 발행 :
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
scp audit-policy.yaml root@${node_ip}:/etc/kubernetes/audit-policy.yaml
done
진 분산 KUBE-apiserver
모든 마스터 노드에 배포 KUBE-apiserver 바이너리
cd /opt/k8s/work/
source /opt/k8s/bin/environment.sh
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
scp kubernetes/server/bin/kube-apiserver root@${node_ip}:/opt/k8s/bin/
done
사용의 후속 방문 메트릭 - 서버 인증서 만들기
인증서 서명 요청을 만듭니다
cat > proxy-client-csr.json <<EOF
{
"CN": "aggregator",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "4Paradigm"
}
]
}
EOF
- CN 이름의 요구는 권한이 부족은 후속에 방문 메트릭을 그렇지 않으면 메시지가 표시됩니다에 --requestheader - 수 - 이름 인수 KUBE-apiserver에 있어야합니다.
인증서와 개인 키를 생성합니다 :
cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \
-ca-key=/etc/kubernetes/cert/ca-key.pem \
-config=/etc/kubernetes/cert/ca-config.json \
-profile=kubernetes proxy-client-csr.json | cfssljson -bare proxy-client
ls proxy-client*.pem
모든 노드에 인증서 및 개인 키 생성 마스터 파일을 복사합니다 :
source /opt/k8s/bin/environment.sh
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
scp proxy-client*.pem root@${node_ip}:/etc/kubernetes/cert/
done
만들기 KUBE-apiserver systemd 단위 템플릿 파일
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
cat > kube-apiserver.service.template <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
WorkingDirectory=${K8S_DIR}/kube-apiserver
ExecStart=/opt/k8s/bin/kube-apiserver \\
--advertise-address=##NODE_IP## \\
--default-not-ready-toleration-seconds=360 \\
--default-unreachable-toleration-seconds=360 \\
--feature-gates=DynamicAuditing=true \\
--max-mutating-requests-inflight=2000 \\
--max-requests-inflight=4000 \\
--default-watch-cache-size=200 \\
--delete-collection-workers=2 \\
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml \\
--etcd-cafile=/etc/kubernetes/cert/ca.pem \\
--etcd-certfile=/etc/kubernetes/cert/kubernetes.pem \\
--etcd-keyfile=/etc/kubernetes/cert/kubernetes-key.pem \\
--etcd-servers=${ETCD_ENDPOINTS} \\
--bind-address=##NODE_IP## \\
--secure-port=6443 \\
--tls-cert-file=/etc/kubernetes/cert/kubernetes.pem \\
--tls-private-key-file=/etc/kubernetes/cert/kubernetes-key.pem \\
--insecure-port=0 \\
--audit-dynamic-configuration \\
--audit-log-maxage=15 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-truncate-enabled \\
--audit-log-path=${K8S_DIR}/kube-apiserver/audit.log \\
--audit-policy-file=/etc/kubernetes/audit-policy.yaml \\
--profiling \\
--anonymous-auth=false \\
--client-ca-file=/etc/kubernetes/cert/ca.pem \\
--enable-bootstrap-token-auth \\
--requestheader-allowed-names="aggregator" \\
--requestheader-client-ca-file=/etc/kubernetes/cert/ca.pem \\
--requestheader-extra-headers-prefix="X-Remote-Extra-" \\
--requestheader-group-headers=X-Remote-Group \\
--requestheader-username-headers=X-Remote-User \\
--service-account-key-file=/etc/kubernetes/cert/ca.pem \\
--authorization-mode=Node,RBAC \\
--runtime-config=api/all=true \\
--enable-admission-plugins=NodeRestriction \\
--allow-privileged=true \\
--apiserver-count=3 \\
--event-ttl=168h \\
--kubelet-certificate-authority=/etc/kubernetes/cert/ca.pem \\
--kubelet-client-certificate=/etc/kubernetes/cert/kubernetes.pem \\
--kubelet-client-key=/etc/kubernetes/cert/kubernetes-key.pem \\
--kubelet-https=true \\
--kubelet-timeout=10s \\
--proxy-client-cert-file=/etc/kubernetes/cert/proxy-client.pem \\
--proxy-client-key-file=/etc/kubernetes/cert/proxy-client-key.pem \\
--service-cluster-ip-range=${SERVICE_CIDR} \\
--service-node-port-range=${NODE_PORT_RANGE} \\
--logtostderr=true \\
--v=2
Restart=on-failure
RestartSec=10
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
--advertise-address:
IP의 apiserver 외부 원형 (는 Kubernetes 서비스 백엔드 노드 IP);--default-*-toleration-seconds:
이상 노드에 관련된 임계 값을 설정하는 단계;--max-*-requests-inflight:
요청과 관련된 최대 임계 값;--etcd-*:
액세스 인증서와 etcd 서버 주소를 etcd;--experimental-encryption-provider-config:
지정 비밀 etcd 구성의 암호화;--bind-address:
HTTPS IP를 듣고, 그것은 그렇지 않으면 6443 보안 포트 외부에서 액세스 할 수 없습니다, 127.0.0.1이 될 수 없습니다;--secret-port:
HTTPS 포트를 듣고;--insecure-port=0:
닫기 모니터 비보안 HTTP 포트 (8080);--tls-*-file:
인증서 지정 apiserver 사용, CA 개인 키 파일;--audit-*:
구성 감사 전략 및 감사 로그 파일 관련 파라미터;--client-ca-file:
인증 클라이언트 (KUE-컨트롤러 매니저 KUBE-스케줄러 kubelet, KUBE 프록시 등)에 인증서를 요청함으로써 수행;--enable-bootstrap-token-auth:
Kubelet 토큰 인증을 사용 스트랩;--requestheader-*:
KUBE-apiserver 프록시 클라이언트의 HPA에 관한 집계 계층 구성 파라미터 요구;--requestheader-client-ca-file:
메트릭 애그리 게이터 (aggregator)에 사용 활성화, --proxy - 클라이언트 인증서 파일 및 인증서 --proxy 클라이언트 키 파일 지정에 서명;--requestheader-allowed-names:
비어있을 수 없습니다, 쉼표 "어 그리 게이터"를 여기에서 설정 값 CN 이름 --proxy - 클라이언트 인증서 파일의 인증서를 분리;--service-account-key-file:签名 ServiceAccount Token 的公钥文件,kube-controller-manager 的 * *
--service-계정 개인 키-file` 개인 키 파일을 지정, 쌍으로 사용 모두;--runtime-config=api/all=true:
이러한 오토 스케일링 / v2alpha1로하는 API의 모든 버전을 사용;--authorization-mode=Node,RBAC、--anonymous-auth=false:
열기 노드 및 무단 요청에 대한 RBAC 권한 부여 모델;--enable-admission-plugins:
기본 플러그인으로 일부 해제를 사용;--allow-privileged:
특권 컨테이너 실행 권한을 실행;--apiserver-count=3:
Apiserver 인스턴스의 수를 지정;--event-ttl:
시간이 지정된 이벤트를 저장;--kubelet-*:
팁 권한이없는 사용자가 (는 Kubernetes가 .PEM 인증서 사용자는 Kubernetes을 * 위) RBAC 사용자 정의 규칙 또는 방문 kubelet의 API 해당 인증서가 필요합니다; 지정한 경우, https를 사용 액세스 kubelet API를;--proxy-client-*:
apiserver 측정 서버 액세스 자격 증명이 사용;--service-cluster-ip-range:
서비스 클러스터 IP 주소를 지정된 기간;--service-node-port-range:
지정된 포트 범위 NodePort;
기계가 KUBE-apiserver의 KUBE-프록시를 실행하지 않는 경우, --enable-애그리 게이터 (aggregator) 라우팅 = true 매개 변수를 추가해야합니다;
--requestheader-XXX-관련 매개 변수에 대해 다음을 참조하십시오
- https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts/auth.md
- https://docs.bitnami.com/kubernetes/how-to/configure-autoscaling-custom-metrics/
참고 :
- 에 RequestHeader 클라이언트-CA 파일, 당신은 클라이언트 인증 및 서버 인증이 있어야 CA 인증서를 지정;
- --requestheader이-허용-이름을 경우 비어 있지 및 --proxy - 클라이언트 인증서 파일은 인증서 CN 이름이 허용-이름되지 않으며, 후속보기 노드 장애 또는 측정의 포드, 팁 :
[root@zhangjun-k8s01 1.8+]# kubectl top nodes
Error from server (Forbidden): nodes.metrics.k8s.io is forbidden: User "aggregator" cannot list resource "nodes" in API group "metrics.k8s.io" at the cluster scope
작성하고 각 노드에 대해 KUBE-apiserver systemd 유닛 파일을 배포
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for (( i=0; i < 3; i++ ))
do
sed -e "s/##NODE_NAME##/${NODE_NAMES[i]}/" -e "s/##NODE_IP##/${NODE_IPS[i]}/" kube-apiserver.service.template > kube-apiserver-${NODE_IPS[i]}.service
done
ls kube-apiserver*.service
- NODE_NAMES 동일한 길이 배시 배열 NODE_IPS 각각의 노드 이름과 IP에 대응
배포 systemd 유닛 파일을 생성 :
cd /opt/k8s/work
source /opt/k8s/bin/environment.sh
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
scp kube-apiserver-${node_ip}.service root@${node_ip}:/etc/systemd/system/kube-apiserver.service
done
- KUBE-apiserver.service에 파일의 이름을 변경;
시작 apiserver
source /opt/k8s/bin/environment.sh
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "mkdir -p ${K8S_DIR}/kube-apiserver"
ssh root@${node_ip} "systemctl daemon-reload && systemctl enable kube-apiserver && systemctl restart kube-apiserver"
done
검사 서비스는 정상입니다
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "systemctl status kube-apiserver |grep 'Active:'"
done
출력 결과는 다음이다
[root@node01 work]# for node_ip in ${MASTER_IPS[@]}
> do
> echo ">>> ${node_ip}"
> ssh root@${node_ip} "systemctl status kube-apiserver |grep 'Active:'"
> done
>>> 10.0.20.11
Active: active (running) since Thu 2019-12-05 14:29:01 CST; 29s ago
>>> 10.0.20.12
Active: active (running) since Thu 2019-12-05 14:29:27 CST; 3s ago
>>> 10.0.20.13
Active: active (running) since Thu 2019-12-05 14:29:27 CST; 3s ago
보기 포트 포트 apiserver 시작 :
for node_ip in ${MASTER_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "netstat -lntup|grep kube-apiserver |grep '6443'"
done
[root@node01 work]# for node_ip in ${MASTER_IPS[@]}
> do
> echo ">>> ${node_ip}"
> ssh root@${node_ip} "netstat -lntup|grep kube-apiserver |grep '6443'"
> done
>>> 10.0.20.11
tcp 0 0 10.0.20.11:6443 0.0.0.0:* LISTEN 2891/kube-apiserver
>>> 10.0.20.12
tcp 0 0 10.0.20.12:6443 0.0.0.0:* LISTEN 2391/kube-apiserver
>>> 10.0.20.13
tcp 0 0 10.0.20.13:6443 0.0.0.0:* LISTEN 2436/kube-apiserver
KUBE-apiserver 인쇄 데이터 작성 etcd
source /opt/k8s/bin/environment.sh
ETCDCTL_API=3 etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--cacert=/opt/k8s/work/ca.pem \
--cert=/opt/k8s/work/etcd.pem \
--key=/opt/k8s/work/etcd-key.pem \
get /registry/ --prefix --keys-only