静态Pod方式安装kubernetes 19.2

1 说明

在以往的文档中介绍过二进制的方式安装kubernetes,二进制方式安装费事,费力还不好管理,本文以静态POD方式安装,处理kubelet其他组件都是以容器的方式启动。开始之前先介绍下什么是静态POD,通常情况下POD都是由kubernetes来创建的,但是在搭建kubernetes之前还没有集群,就没办法用kubernetes来创建pod。好在有一种方式可以脱离kubernetes集群,由kubelet来创建POD,这种用kubelet创建的POD,就称为静态POD。
既然不是通过kubernetes来创建的POD,当然该类POD就不属于kubernetes的管辖范围,不过kubelet会为该POD创建一个镜像POD,让kubernetes能看到镜像POD,这样就可以从kubernetes集群内通过kubectl工具看到该POD,当该POD删除的时候镜像POD也就删除了。
kubelet在启动的时候会去--manifests目录中找相应的yaml文件,让后创建对应的POD,默认的manifests目录是/etc/kubernetes/manifests
以上就是对静态POD的说明

2 构架规划

本文使用到的相关机器如下,etcd是单台,建议用集群,本文k8s master为单点。


静态Pod方式安装kubernetes 19.2_第1张图片
BF064FD1-59C7-4AF3-A532-093BBE3A4305.png

3 初始化

3.1 网络规划

master-ip: 192.168.20.90
cluster-cidr: 10.244.0.0/16
service-ip-range: 10.96.0.0/12
dns: 10.96.0.10
bootstrap token
token-id: head -c 6 /dev/urandom | md5sum | head -c 6 (用该命令生成)
token-secret: head -c 16 /dev/urandom | md5sum | head -c 16 (用该命令生成)

3.2 所需软件

更新ubuntu源,建议用阿里云的源

apt-get update && apt-get install -y apt-transport-https curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
cat  >/etc/apt/sources.list.d/kubernetes.list <

3.3 禁用swap

临时命令:swapoff -a
永久命令:注释/etc/fstab相关行

3.4 相关目录

[ ! -d "/etc/cni/net.d" ] && mkdir -p /etc/cni/net.d
[ ! -d "/tmp/cert" ] && mkdir /tmp/cert
[ ! -d "/etc/kubernetes/pki/etcd" ] && mkdir -p /etc/kubernetes/pki/etcd
[ ! -d "/etc/kubernetes/manifests" ] && mkdir -p /etc/kubernetes/manifests
[ ! -d /var/lib/kubelet ] && mkdir -p /var/lib/kubelet

4 自签发证书

4.1 工具准备

用cfssl这个工具来生成自签证书

curl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfsslinfo
chmod +x /usr/local/bin/cfssl*

4.2 所需证书

签名文件,所有证书都用这个配置文件

cat >/tmp/cert/config.json<

4.2.1 根证书
本文用同一个根证书

cat >/tmp/cert/ca.json<

注意expiry证书的过期时间,默认为8760h,即一年。

4.2.2 etcd server端证书
hosts里面把所有etcd节点都写上,本文只有一个节点

cat >/tmp/cert/etcd-server.json<

4.2.3 etcd peer 证书
用于etcd集群节点内部的验证
hosts里面把所有etcd节点都写上,本文只有一个节点

cat >/tmp/cert/etcd-peer.json<

4.2.4 etcd-client证书
用于apiserver访问etcd,apiserver作为etcd的客户端

cat >/tmp/cert/etcd-client.json<

4.2.5 cluster admin证书
用户管理员管理kubernetes集群

cat > /tmp/cert/admin.json<

4.2.6 apiserver证书
hosts里面写apiserver节点的ip,cluster_cidr段的第一个ip,service-ip-range段的第一个ip,DNS的ip。

cat >/tmp/cert/apiserver.json<

4.2.7 apiserver-kubelet-client
用于apiserver和kubelet通信,O 为"system:masters"组,默认就有kubernetes所有资源的所有操作权限

cat >/tmp/cert/apiserver-kubelet-client.json<

4.2.8 controller-manager
用于controller-manager访问apiserver

cat >/tmp/cert/controller-manager.json<

4.2.9 scheduler
用于scheduler和apiserver交互

cat >/tmp/cert/scheduler.json<

4.2.10 front-proxy-ca
用于apiserver aggregator

cat >/tmp/cert/front-proxy-ca.json<

4.2.11 front-proxy-client
用于apiserver aggregator

cat >/tmp/cert/front-proxy-client.json<

4.1.12 serviceaccount证书
用于pod和apiserver交互

cd /tmp/cert
openssl genrsa -out sa.key 1024  &&   openssl rsa -in sa.key -pubout -out sa.pub

共签发了20多个证书


静态Pod方式安装kubernetes 19.2_第2张图片
tapd_20104951_1605783836_85.jpg

4.3 分发证书

将图示的证书分别copy到/etc/kubernetes/pki目录以及/etc/kubernetes/pki/etcd目录下。pki 和pki/etcd中的ca证书是一样的。

5 生成kubeconfig文件

用签发的各类证书,创建各个组件的配置文件,这个组件将利用创建的配置文件和apiserver通信,注意替换master_ip 为实际的master ip

5.1 controller-manage.conf

kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-credentials system:kube-controller-manager --client-certificate=/etc/kubernetes/pki/controller-manager.crt --embed-certs=true --client-key=/etc/kubernetes/pki/controller-manager.key --kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config set-context system:kube-controller-manager@kubernetes --cluster=kubernetes --user=system:kube-controller-manager --kubeconfig=/etc/kubernetes/controller-manager.conf
kubectl config use-context system:kube-controller-manager@kubernetes --kubeconfig=/etc/kubernetes/controller-manager.conf

5.2 scheduler.conf

kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-credentials system:kube-scheduler --client-certificate=/etc/kubernetes/pki/scheduler.crt --embed-certs=true --client-key=/etc/kubernetes/pki/scheduler.key --kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config set-context system:kube-scheduler@kubernetes --cluster=kubernetes --user=system:kube-scheduler --kubeconfig=/etc/kubernetes/scheduler.conf
kubectl config use-context system:kube-scheduler@kubernetes  --kubeconfig=/etc/kubernetes/scheduler.conf

5.3 cluster-admin.conf

kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/$(whoami)/.kube/config
kubectl config set-credentials kubernetes-admin --client-certificate=/etc/kubernetes/pki/admin.crt --embed-certs=true --client-key=/etc/kubernetes/pki/admin.key --kubeconfig=/$(whoami)/.kube/config
kubectl config set-context kubernetes-admin@kubernetes --cluster=kubernetes --user=kubernetes-admin --kubeconfig=/$(whoami)/.kube/config
kubectl config use-context kubernetes-admin@kubernetes --kubeconfig=/$(whoami)/.kube/config

5.4 kubelet-bootstrap.conf

注意其中的--token,格式为: 6位随机字符.16为随机字符,这是一个临时token,kubelet第一次和apiserver通信的引导文件,具体原理在Kubelet TLS Bootstrap是啥中有介绍

kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://${master_ip}:6443 --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config set-credentials kubelet-bootstrap --token=${token-id}.${token-secret} --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config set-context kubelet-bootstrap@kubernetes --cluster=kubernetes --user=kubelet-bootstrap --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf
kubectl config use-context kubelet-bootstrap@kubernetes --kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf

6 yaml文件启动相关容器

6.1 apiserver.yml

cat >/etc/kubernetes/manifests/apiserver.yaml<

6.2 controller-manager.yml

cat >/etc/kubernetes/manifests/controller-manager.yaml<

6.3 scheduler.yml

cat >/etc/kubernetes/manifests/scheduler.yaml<

6.4 kubelet.yml

cat >/var/lib/kubelet/config.yaml<

7 kubelet服务

7.1 kubelet.service 文件

cat >/lib/systemd/system/kubelet.service <

7.2 重启kubelet服务

systemctl daemon-reload
systemctl restart kubelet
此时会看到集群已经启动,但是master节点是处于noready状态,因为节点还没有注册进来

8 创建bootstrap secret

cat <"
  name: bootstrap-token-${token-id}
  namespace: kube-system

# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
  # Human readable description. Optional.
  description: "The default bootstrap token generated by 'kubeadm init'."

  # Token ID and secret. Required.
  token-id: '${token-id}'
  token-secret: '${token-secret}'

  # Expiration. Optional.
  expiration: 2020-12-10T00:00:11Z

  # Allowed usages.
  usage-bootstrap-authentication: "true"
  usage-bootstrap-signing: "true"

  # Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
  auth-extra-groups: system:bootstrappers:kubelet-bootstrap
EOF

9 CSR授权

cat <

现在节点应该加入集群了

10 踩坑

问题1

User "system:anonymous" cannot get resource "nodes" in API group "" at the cluster scope
解决:
注意csr secret中的token 是否和bootstrap-kubelet.conf中的token是否一致

问题2

Unable to register node "k8s-master" with API server: nodes is forbidden: User "system:anonymous" cannot create resource "nodes" in API group "" at the cluster scope
解决:
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:bootstrappers
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --group=system:bootstrappers

问题3

invalid bearer token
token 过期或是无效

问题4

可能会遇到10.96.0.1:443 i/o timeout
解决
kube-proxy-configmap
data.kubeconfig.conf.clusters.cluster.server: https://192.168.20.104:6443 (master ip要写对,否则会导致proxy 启动错误,IPtable没有生效,10.96.0.1没有转发规则)

你可能感兴趣的:(静态Pod方式安装kubernetes 19.2)