3.从0安装kubernetes集群-配置master节点

### pod启动kube-apiserver等组件的方式

## 1.安装kube组件
mkdir -p /data/kubernetes
cp /data/kubernetes-server-linux-amd64.tar.gz /data/kubernetes/kubernetes-server-linux-amd64.tar.gz
cd /data/kubernetes
tar -xzvf kubernetes-server-linux-amd64.tar.gz
cp /data/kubernetes/kubernetes/server/bin/kubelet /usr/local/bin/kubelet
cp /data/kubernetes/kubernetes/server/bin/kubectl /usr/local/bin/kubectl
chmod +x /usr/local/bin/kubelet /usr/local/bin/kubectl

## 2.安装cni
mkdir -p /opt/cni/bin
cd /opt/cni/bin
cp /data/download/cni-plugins-amd64-v0.6.0.tgz /opt/cni/bin/cni-plugins-amd64-v0.6.0.tgz
tar -zxvf cni-plugins-amd64-v0.6.0.tgz

### 3.创建CA和Certificates
## 在这部分,将会需要生成 client 与 server 的各组件 certificates,并且替 Kubernetes admin user 生成 client 证书。
mkdir -p /etc/kubernetes/pki
cd /etc/kubernetes/pki
## 注意IP
export KUBE_APISERVER="https://192.168.162.128:6443"

## 3.1.下载ca-config.json与ca-csr.json文件,并生成 CA 密钥:
cp /data/download/ca-config.json /etc/kubernetes/pki/ca-config.json
cp /data/download/ca-csr.json /etc/kubernetes/pki/ca-csr.json
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ls ca*.pem

## 3.2.下载apiserver-csr.json文件,并生成 kube-apiserver certificate 证书:
cp /data/download/apiserver-csr.json /etc/kubernetes/pki/apiserver-csr.json
## 注意IP
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-hostname=10.96.0.1,192.168.162.128,127.0.0.1,kubernetes.default \
-profile=kubernetes \
apiserver-csr.json | cfssljson -bare apiserver
ls apiserver*.pem

## 3.3.下载front-proxy-ca-csr.json文件,并生成 Front proxy CA 密钥,Front proxy 主要是用在 API aggregator 上:
cp /data/download/front-proxy-ca-csr.json /etc/kubernetes/pki/front-proxy-ca-csr.json
cfssl gencert \
-initca front-proxy-ca-csr.json | cfssljson -bare front-proxy-ca
ls front-proxy-ca*.pem

## 3.4.下载front-proxy-client-csr.json文件,并生成 front-proxy-client 证书:
cp /data/download/front-proxy-client-csr.json /etc/kubernetes/pki/front-proxy-client-csr.json
cfssl gencert \
-ca=front-proxy-ca.pem \
-ca-key=front-proxy-ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
front-proxy-client-csr.json | cfssljson -bare front-proxy-client
ls front-proxy-client*.pem

## 4.由于通过手动创建 CA 方式太过繁杂,只适合少量机器,因为每次签证时都需要绑定 Node IP,
##   随机器增加会带来很多困扰,因此这边使用 TLS Bootstrapping 方式进行授权,
##   由 apiserver 自动给符合条件的 Node 发送证书来授权加入集群。主要做法是 kubelet 启动时,
##   向 kube-apiserver 传送 TLS Bootstrapping 请求,而 kube-apiserver 验证 kubelet 请求
##   的 token 是否与设定的一样,若一样就自动产生 kubelet 证书与密钥。具体作法可以参考 TLS bootstrapping。

## 4.1.首先建立一个变量来产生BOOTSTRAP_TOKEN:
cd /etc/kubernetes/pki
export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
cat <<EOF > /etc/kubernetes/BOOTSTRAP_TOKEN
${BOOTSTRAP_TOKEN}
EOF
cat <<EOF > /etc/kubernetes/token.csv
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

## 4.2.建立 bootstrap.conf 的 kubeconfig 文件
## bootstrap set-cluster
kubectl config set-cluster kubernetes \
    --certificate-authority=ca.pem \
    --embed-certs=true \
    --server=${KUBE_APISERVER} \
    --kubeconfig=../bootstrap.conf
## bootstrap set-credentials
kubectl config set-credentials kubelet-bootstrap \
    --token=${BOOTSTRAP_TOKEN} \
    --kubeconfig=../bootstrap.conf
## bootstrap set-context
kubectl config set-context default \
    --cluster=kubernetes \
    --user=kubelet-bootstrap \
   --kubeconfig=../bootstrap.conf
## bootstrap set default context
kubectl config use-context default --kubeconfig=../bootstrap.conf

## Admin certificate
## 4.3.下载admin-csr.json文件,并生成 admin certificate 证书:
cp /data/download/admin-csr.json /etc/kubernetes/pki/admin-csr.json
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
admin-csr.json | cfssljson -bare admin
ls admin*.pem

## 4.4.接着通过以下指令生成名称为 admin.conf 的 kubeconfig 文件:
## admin set-cluster
kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=../admin.conf
## admin set-credentials
kubectl config set-credentials kubernetes-admin \
  --client-certificate=admin.pem \
  --client-key=admin-key.pem \
  --embed-certs=true \
  --kubeconfig=../admin.conf
## admin set-context
kubectl config set-context kubernetes-admin@kubernetes \
  --cluster=kubernetes \
  --user=kubernetes-admin \
  --kubeconfig=../admin.conf
## admin set default context
kubectl config use-context kubernetes-admin@kubernetes \
  --kubeconfig=../admin.conf

## Controller manager certificate
## 4.5.下载manager-csr.json文件
cp /data/download/manager-csr.json /etc/kubernetes/pki/manager-csr.json
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
manager-csr.json | cfssljson -bare controller-manager
ls controller-manager*.pem

## 4.6.生成 kube-controller-manager certificate 证书:
## controller-manager set-cluster
kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=../controller-manager.conf

## controller-manager set-credentials
kubectl config set-credentials system:kube-controller-manager \
  --client-certificate=controller-manager.pem \
  --client-key=controller-manager-key.pem \
  --embed-certs=true \
  --kubeconfig=../controller-manager.conf

## controller-manager set-context
kubectl config set-context system:kube-controller-manager@kubernetes \
  --cluster=kubernetes \
  --user=system:kube-controller-manager \
  --kubeconfig=../controller-manager.conf

## controller-manager set default context
kubectl config use-context system:kube-controller-manager@kubernetes \
  --kubeconfig=../controller-manager.conf

## Scheduler certificate
## 4.7.下载scheduler-csr.json文件
cp /data/download/scheduler-csr.json /etc/kubernetes/pki/scheduler-csr.json
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
scheduler-csr.json | cfssljson -bare scheduler
ls scheduler*.pem

## 4.8.生成 kube-scheduler certificate 证书:
## scheduler set-cluster
kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=../scheduler.conf

## scheduler set-credentials
kubectl config set-credentials system:kube-scheduler \
  --client-certificate=scheduler.pem \
  --client-key=scheduler-key.pem \
  --embed-certs=true \
  --kubeconfig=../scheduler.conf

## scheduler set-context
kubectl config set-context system:kube-scheduler@kubernetes \
  --cluster=kubernetes \
  --user=system:kube-scheduler \
  --kubeconfig=../scheduler.conf

##scheduler set default context
kubectl config use-context system:kube-scheduler@kubernetes \
  --kubeconfig=../scheduler.conf

## Kubelet master certificate
## 4.9.下载kubelet-csr.json文件
cp /data/download/kubelet-csr.json /etc/kubernetes/pki/kubelet-csr.json
## 注意节点名称
sed -i 's/$NODE/master1/g' kubelet-csr.json
## 注意IP
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-hostname=master1,192.168.162.128,192.168.162.128 \
-profile=kubernetes \
kubelet-csr.json | cfssljson -bare kubelet
ls kubelet*.pem

## 4.10.生成 master node certificate 证书:
## 注意节点名称
## kubelet set-cluster
kubectl config set-cluster kubernetes \
  --certificate-authority=ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=../kubelet.conf

## kubelet set-credentials
kubectl config set-credentials system:node:master1 \
  --client-certificate=kubelet.pem \
  --client-key=kubelet-key.pem \
  --embed-certs=true \
  --kubeconfig=../kubelet.conf

## kubelet set-context
kubectl config set-context system:node:master1@kubernetes \
  --cluster=kubernetes \
  --user=system:node:master1 \
  --kubeconfig=../kubelet.conf

## kubelet set default context
kubectl config use-context system:node:master1@kubernetes \
  --kubeconfig=../kubelet.conf

### Service account key
## 4.11.Service account 不是通过 CA 进行认证,因此不要通过 CA 来做 Service account key 的检查,
## 这边建立一组 Private 与 Public 密钥提供给 Service account key 使用:
openssl genrsa -out sa.key 2048
openssl rsa -in sa.key -pubout -out sa.pub
ls sa.*

ls /etc/kubernetes/
ls /etc/kubernetes/pki


### 5.安装 Kubernetes 核心组件
## 5.1.首先下载 Kubernetes 核心组件 YAML 文件,这边我们不透过 Binary 方案来创建 Master 核心组件,
## 而是利用 Kubernetes Static Pod 来创建,因此需下载所有核心组件的Static Pod文件到/etc/kubernetes/manifests目录:
mkdir -p /etc/kubernetes/manifests
cd /etc/kubernetes/manifests
## 注意IP apiserver.yml中
for FILE in apiserver manager scheduler; do
  cp /data/download/${FILE}.yml /etc/kubernetes/manifests/${FILE}.yml
done

## 5.2.生成一个用来加密 Etcd 的 Key:
ETCD_RANDOM_KEY=`head -c 32 /dev/urandom | base64`
echo $ETCD_RANDOM_KEY
cat <<EOF > /etc/kubernetes/encryption.yml
kind: EncryptionConfig
apiVersion: v1
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: ${ETCD_RANDOM_KEY}
      - identity: {}
EOF

## 5.3.在/etc/kubernetes/目录下,创建audit-policy.yml的进阶审核策略 YAML 文件:
cat <<EOF > /etc/kubernetes/audit-policy.yml
apiVersion: audit.k8s.io/v1beta1
kind: Policy
rules:
- level: Metadata
EOF

## 5.4.下载kubelet.service相关文件来管理 kubelet:
mkdir -p /etc/systemd/system/kubelet.service.d
#10-kubelet.conf(注意此文件启动项)
cp /data/download/kubelet.service /lib/systemd/system/kubelet.service
cp /data/download/10-kubelet.conf /etc/systemd/system/kubelet.service.d/10-kubelet.conf

## 5.5.最后创建 var 存放信息,然后启动 kubelet 服务:
mkdir -p /var/lib/kubelet /var/log/kubernetes
systemctl daemon-reload
systemctl enable kubelet.service
systemctl start kubelet.service

## 5.6.完成后会需要一段时间来下载镜像文件与启动组件,可以利用该指令来查看:
#watch netstat -nltp
#tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      23012/kubelet
#tcp        0      0 127.0.0.1:10251         0.0.0.0:*               LISTEN      22305/kube-schedule
#tcp        0      0 127.0.0.1:10252         0.0.0.0:*               LISTEN      22529/kube-controll
#tcp6       0      0 :::6443                 :::*                    LISTEN      22956/kube-apiserve

## 5.7.国内无法下载谷歌镜像,需提前下载国内镜像并重命名
## 安装docker后时下载


## 6.完成后,复制 admin kubeconfig 文件,并通过简单指令验证:
cp /etc/kubernetes/admin.conf ~/.kube/config
kubectl get cs
#NAME                 STATUS    MESSAGE              ERROR
#etcd-0               Healthy   {"health": "true"}
#scheduler            Healthy   ok
#controller-manager   Healthy   ok

kubectl get node
#NAME      STATUS     ROLES     AGE       VERSION
#master1   NotReady   master    4m        v1.8.2

kubectl -n kube-system get pods
#NAME                              READY     STATUS    RESTARTS   AGE
#kube-apiserver-master1            1/1       Running   0          4m
#kube-controller-manager-master1   1/1       Running   0          4m
#kube-scheduler-master1            1/1       Running   0          4m


## 7.确认服务能够执行 logs 等指令:
kubectl -n kube-system logs -f kube-scheduler-master1
## Error from server (Forbidden): Forbidden (user=kube-apiserver, verb=get, resource=nodes, subresource=proxy) ( pods/log kube-apiserver-master1)
## 这边会发现出现 403 Forbidden 问题,这是因为 kube-apiserver user 并没有 nodes 的资源权限,属于正常。
## 由于上述权限问题,我们必需创建一个 apiserver-to-kubelet-rbac.yml 来定义权限,以供我们执行 logs、exec 等指令:
cd /etc/kubernetes/
cp /data/download/apiserver-to-kubelet-rbac.yml /etc/kubernetes/apiserver-to-kubelet-rbac.yml
kubectl apply -f apiserver-to-kubelet-rbac.yml


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值