美文网首页
kubernetes集群搭建五:配置apiserver

kubernetes集群搭建五:配置apiserver

作者: 开始懂了90 | 来源:发表于2018-12-18 16:58 被阅读0次

创建 kubernetes 证书

cd /opt/ssl

# 如果使用负载均衡器 记得写入负载均衡器的域名

cat > kubernetes-csr.json << EOF
{
  "CN": "kubernetes",
  "hosts": [
    "127.0.0.1",
    "10.39.7.51",
    "10.39.7.52",
    "10.39.7.57",
    "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": "System"
    }
  ]
}
EOF
  • 这里 hosts 字段中 三个 IP 分别为 127.0.0.1, 10.39.7.51, 10.39.7.52, 10.39.7.57 为 Master 的IP,有多个Master需要写多个masterIP
  • 如果使用了负载均衡器 也要写上域名
  • 10.254.0.1 为 kubernetes SVC 的 IP, 一般是 部署网络的第一个IP , 如: 10.254.0.1 , 在启动完成后,我们使用 kubectl get svc , 就可以查看到

生成 kubernetes 证书和私钥

cfssl gencert -ca=/opt/ssl/ca.pem \
  -ca-key=/opt/ssl/ca-key.pem \
  -config=/opt/ssl/ca-config.json \
  -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

分发kubernetes证书

cp kubernetes* /etc/kubernetes/ssl
scp kubernetes* root@10.39.7.52:/etc/kubernetes/ssl
scp kubernetes* root@10.39.7.57:/etc/kubernetes/ssl

配置 kube-apiserver

  • kubelet 首次启动时向 kube-apiserver 发送 TLS Bootstrapping 请求,kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token 一致,如果一致则自动为 kubelet生成证书和秘钥
# 生成 token

[root@k8s-master-6 ssl]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
8cd1b18581291d05dd07ee6b0ae748a6

# 创建 token.csv 文件

cd /opt/ssl

cat > /etc/kubernetes/token.csv << EOF
8cd1b18581291d05dd07ee6b0ae748a6,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

审计

cat > /etc/kubernetes/audit-policy.yaml<<EOF
apiVersion: audit.k8s.io/v1beta1
kind: Policy
rules:
- level: Metadata
EOF

#分发略

生成加密encryption-config.yaml文件

cat > encryption-config.yaml <<EOF
kind: EncryptionConfig
apiVersion: v1
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: 8cd1b18581291d05dd07ee6b0ae748a6
      - identity: {}
EOF

分发

cp  encryption-config.yaml /etc/kubernetes/
scp  encryption-config.yaml root@10.39.7.52:/etc/kubernetes/
scp  encryption-config.yaml root@10.39.7.57:/etc/kubernetes/

创建api-server 需要的相关目录

  • kubelet 创建pod有三种方式: 指定目录 URl 和api-server 我们创建的kubeapi-server kube-controller-manager kube-scheduler 都已json文件的形式放在/etc/kubernetes/manifests目录下 kubelet在启动是会加载这个目录并创建此目录下的需要的pod。如果删除了这里定义的pod 如apiserver 只需要重启kubelet服务就回重新自动创建
mkdir -pv /var/log/kubernetes/
mkdir -pv /etc/kubernetes/manifests

创建 kube-apiserver.json 文件

cat  > /etc/kubernetes/manifests/kube-apiserver.json<<EOF
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "kube-apiserver",
    "namespace": "kube-system",
    "creationTimestamp": null,
    "labels": {
      "component": "kube-apiserver",
      "tier": "control-plane"
    }
  },
  "spec": {
    "volumes": [
      {
  "name": "certs",
  "hostPath": {
    "path": "/etc/ssl/certs"
  }
      },
      {
        "name": "hosts",
        "hostPath": {
          "path": "/etc/hosts"
        }
      },
      {
  "name": "pki",
  "hostPath": {
    "path": "/etc/kubernetes"
  }
      }
    ],
    "containers": [
      {
  "name": "kube-apiserver",
  "image": "harbor.enncloud.cn/enncloud/hyperkube-amd64:v1.11.2",
  "imagePullPolicy": "Always",
  "command": [
    "/apiserver",
    "--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota",
    "--anonymous-auth=false",
    "--token-auth-file=/etc/kubernetes/token.csv",
    "--advertise-address=10.39.7.51",
    "--allow-privileged=true",
    "--apiserver-count=3",
    "--audit-policy-file=/etc/kubernetes/audit-policy.yaml",
    "--audit-log-maxage=30",
    "--audit-log-maxbackup=3",
    "--audit-log-maxsize=100",
    "--audit-log-path=/var/log/kubernetes/audit.log",
    "--authorization-mode=Node,AlwaysAllow",
    "--bind-address=10.39.7.51",
    "--secure-port=6443",
    "--client-ca-file=/etc/kubernetes/ssl/ca.pem",
    "--kubelet-client-certificate=/etc/kubernetes/ssl/kubernetes.pem",
    "--kubelet-client-key=/etc/kubernetes/ssl/kubernetes-key.pem",
    "--enable-swagger-ui=true",
    "--etcd-cafile=/etc/kubernetes/ssl/ca.pem",
    "--etcd-certfile=/etc/kubernetes/ssl/etcd.pem",
    "--etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem",
    "--etcd-servers=https://10.39.7.51:2379,https://10.39.7.52:2379,https://10.39.7.57:2379",
    "--event-ttl=1h",
    "--kubelet-https=true",
    "--insecure-bind-address=127.0.0.1",
    "--insecure-port=8080",
    "--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem",
    "--service-cluster-ip-range=10.254.0.0/18",
    "--service-node-port-range=30000-32000",
    "--tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem",
    "--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem",
    "--enable-bootstrap-token-auth",
          "--requestheader-client-ca-file=/etc/kubernetes/ssl/ca.pem", 
          "--requestheader-allowed-names=admin", 
          "--requestheader-extra-headers-prefix=X-Remote-Extra-", 
          "--requestheader-group-headers=X-Remote-Group", 
          "--requestheader-username-headers=X-Remote-User", 
          "--proxy-client-cert-file=/etc/kubernetes/ssl/admin.pem", 
          "--proxy-client-key-file=/etc/kubernetes/ssl/admin-key.pem", 
          "--enable-aggregator-routing=true", 
    "--v=2"
  ],
  "resources": {
    "requests": {
      "cpu": "250m"
    }
  },
  "volumeMounts": [
    {
      "name": "certs",
      "mountPath": "/etc/ssl/certs"
    },
         {
            "name": "hosts",
            "mountPath": "/etc/hosts"
          },
    {
      "name": "pki",
      "readOnly": true,
      "mountPath": "/etc/kubernetes/"
    }
  ],
  "livenessProbe": {
    "httpGet": {
      "path": "/healthz",
      "port": 8080,
      "host": "127.0.0.1"
    },
    "initialDelaySeconds": 15,
    "timeoutSeconds": 15,
    "failureThreshold": 8
  }
      }
    ],
    "hostNetwork": true
  }
 }
EOF

创建kube-scheduler.json

cat > /etc/kubernetes/manifests/kube-scheduler.json <<EOF
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "kube-scheduler",
    "namespace": "kube-system",
    "creationTimestamp": null,
    "labels": {
      "component": "kube-scheduler",
      "tier": "control-plane"
    }
  },
  "spec": {
    "containers": [
      {
  "name": "kube-scheduler",
  "image": "harbor.enncloud.cn/enncloud/hyperkube-amd64:v1.11.2",
  "imagePullPolicy": "Always",
  "command": [
    "/scheduler",
    "--address=127.0.0.1",
    "--master=http://127.0.0.1:8080",
    "--leader-elect=true",
    "--v=2"
  ],
  "resources": {
    "requests": {
      "cpu": "100m"
    }
  },
  "livenessProbe": {
    "httpGet": {
      "path": "/healthz",
      "port": 10251,
      "host": "127.0.0.1"
    },
    "initialDelaySeconds": 15,
    "timeoutSeconds": 15,
    "failureThreshold": 8
  }
      }
    ],
    "hostNetwork": true
  }
}
EOF

创建 kube-controller-manager.json

cat > /etc/kubernetes/manifests/kube-controller-manager.json <<EOF
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "kube-controller-manager",
    "namespace": "kube-system",
    "labels": {
      "component": "kube-controller-manager",
      "tier": "control-plane"
    }
  },
  "spec": {
    "volumes": [
      {
  "name": "certs",
  "hostPath": {
    "path": "/etc/ssl/certs"
  }
      },
      {
  "name": "pki",
  "hostPath": {
    "path": "/etc/kubernetes"
  }
      },
      {
  "name": "plugin",
  "hostPath": {
    "path": "/usr/libexec/kubernetes/kubelet-plugins"
  }
      },
      {
  "name": "qingcloud",
  "hostPath": {
    "path": "/etc/qingcloud"
  }
      }
    ],
    "containers": [
      {
  "name": "kube-controller-manager",
  "image": "harbor.enncloud.cn/enncloud/hyperkube-amd64:v1.11.2",
  "imagePullPolicy": "Always",
  "command": [
    "/controller-manager",
    "--address=127.0.0.1",
    "--master=http://127.0.0.1:8080",
    "--allocate-node-cidrs=false",
    "--service-cluster-ip-range=10.254.0.0/18",
    "--cluster-cidr=10.254.64.0/18",
    "--cluster-name=kubernetes",
    "--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem",
    "--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem",
    "--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem",
    "--root-ca-file=/etc/kubernetes/ssl/ca.pem",
    "--experimental-cluster-signing-duration=86700h0m0s",
    "--leader-elect=true",
    "--controllers=*,tokencleaner,bootstrapsigner",
    "--feature-gates=RotateKubeletServerCertificate=true",
    "--horizontal-pod-autoscaler-use-rest-clients",
    "--horizontal-pod-autoscaler-sync-period=60s",
    "--node-monitor-grace-period=40s",
    " --node-monitor-period=5s",
    "--pod-eviction-timeout=5m0s",
    "--v=10"
  ],
  "resources": {
    "requests": {
      "cpu": "200m"
    }
  },
  "volumeMounts": [
    {
      "name": "certs",
      "mountPath": "/etc/ssl/certs"
    },
    {
      "name": "pki",
      "readOnly": true,
      "mountPath": "/etc/kubernetes/"
    },
                  {
      "name": "plugin",
      "mountPath": "/usr/libexec/kubernetes/kubelet-plugins"
    },
    {
      "name": "qingcloud",
      "readOnly": true,
      "mountPath": "/etc/qingcloud"
    }
  ],
  "livenessProbe": {
    "httpGet": {
      "path": "/healthz",
      "port": 10252,
      "host": "127.0.0.1"
    },
    "initialDelaySeconds": 15,
    "timeoutSeconds": 15,
    "failureThreshold": 8
  }
      }
    ],
    "hostNetwork": true
  }
}
EOF

相关文章

网友评论

      本文标题:kubernetes集群搭建五:配置apiserver

      本文链接:https://www.haomeiwen.com/subject/mvmlkqtx.html