Admin

centos7使用kubeadm搭建k8s笔记
2020年10月21日 11:50 60 0 0 0

centos7使用kubeadm搭建k8s笔记

版本记录

2020-10-25:

  • centos7 2003
  • docker 1.13.1
  • kubelet 1.19.3-0
  • kubeadm 1.19.3-0
  • kubectl 1.19.3-0
  • calico 3.8
  • dashboard 2.0.0

参考文档

搭建 Kubernetes(一) 跟着官方文档从零搭建K8S
搭建的踩坑文档 干货!Kubernates集群搭建及初始化spring cloud环境中遇到的坑
Dashboard参考 部署k8s,安装kubernetes-dashboard Web UI

准备

主机名和hosts

修改主机名 k8s-masterk8s-node1

  1. hostnamectl set-hostname k8s-master

然后编辑文件 /etc/hosts,新增主机名和IP地址关系:

  1. 192.168.1.114 k8s-master
  2. 192.168.1.115 k8s-node1

防火墙

关闭防火墙

  1. systemctl stop firewalld
  2. systemctl disable firewalld

SELinux

编辑文件 /etc/selinux/config,修改为 SELINUX=disabled,重启生效

SWAP

编辑文件 /etc/fstab,注释 swap 行,重启生效

Docker

安装并启用 docker:

  1. yum install -y docker
  2. systemctl enable docker
  3. systemctl start docker

安装Kubernetes

加速

新建文件 /etc/yum.repos.d/kubernetes.repo:

  1. [kubernetes]
  2. name=Kubernetes
  3. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  4. enabled=1
  5. gpgcheck=1
  6. repo_gpgcheck=1
  7. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  8. exclude=kube*

安装

  1. yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  2. systemctl enable kubelet && systemctl start kubelet

网络配置

确保文件 /etc/sysctl.d/k8s.conf 内容:

  1. net.bridge.bridge-nf-call-ip6tables = 1
  2. net.bridge.bridge-nf-call-iptables = 1

生效:

  1. sysctl --system

Master

初始化

生成配置文件:

  1. kubeadm config print init-defaults > kubeadm-init.yaml
  • 修改 advertiseAddress 值为本机网卡IP
  • 修改 imageRepository 值为 imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

使用配置文件,初始化:

  1. kubeadm config images pull --config kubeadm-init.yaml
  2. kubeadm init --config kubeadm-init.yaml

成功输出的最后两行,记得 保存

  1. Your Kubernetes control-plane has initialized successfully!
  2. To start using your cluster, you need to run the following as a regular user:
  3. mkdir -p $HOME/.kube
  4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  6. You should now deploy a pod network to the cluster.
  7. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  8. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  9. Then you can join any number of worker nodes by running the following on each as root:
  10. kubeadm join 192.168.1.114:6443 --token abcdef.0123456789abcdef \
  11. --discovery-token-ca-cert-hash sha256:c5ad42d6716552b2cb7d07bb776305fa124b86024d4ab5c1b92bf134ee7cbb9e

允许 root 用户执行 kubectl:

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

Calico网络

下载配置文件:

  1. wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml

踩坑文里建议不要改直接用,的确建立完成集群没什么问题,过了一个星期服务器重启后发现以下现象:

  • 集群内的容器,无法访问外网,测试命令 curl cip.cc
  • 集群内的容器,无法使用 服务名 访问集群内部署的其他服务,例如: curl nginx-8082:8082nginx-8082 是一个nginx服务,对集群内暴露端口 8082
  • 集群内部署 NodePort 方式对外暴露的服务,只能通过真实节点IP端口访问,无法通过集群内其他节点IP端口访问

参考 k8s master节点nodePort方式不能访问服务,编辑文件 calico.yaml:

修改 CALICO_IPV4POOL_CIDR 的值与文件 kubeadm-init.yamlserviceSubnet 的值一致:

  1. 省略
  2. - name: CALICO_IPV4POOL_CIDR
  3. value: "10.96.0.0/12"
  4. 省略

# Auto-detect the BGP IP address. 前加入 IP_AUTODETECTION_METHOD:

  1. 省略
  2. # Specify interface
  3. - name: IP_AUTODETECTION_METHOD
  4. value: "interface=enp.*"
  5. # Auto-detect the BGP IP address.
  6. - name: IP
  7. value: "autodetect"
  8. 省略
  • enp.* 是宿主机网卡名称前缀,命令 ifconfig 查询

应用生效:

  1. kubectl apply -f calico.yaml

稍等几分钟,查看节点状态,直到 Ready:

  1. [root@k8s-master k8s]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master Ready master 106m v1.19.3

单节点

一般情况下, master 节点都不提供部署能力,所以单节点情况下需要让 master 节点同时作为 node,否则后续部署应用时会提示 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate

  1. kubectl taint nodes --all node-role.kubernetes.io/master-

Node

做完 准备#安装Kubernetes 全部步骤

加入集群,使用 master 初始化的凭证:

  1. kubeadm join 192.168.1.114:6443 --token abcdef.0123456789abcdef \
  2. --discovery-token-ca-cert-hash sha256:c5ad42d6716552b2cb7d07bb776305fa124b86024d4ab5c1b92bf134ee7cbb9e

如果凭证超过有效期(24小时),参考 kubernetes join 卡住 token过期 需要到 master 节点手动生成

生成永久凭证:

  1. kubeadm token create --ttl 0

查询:

  1. kubeadm token list
  2. openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  • 第一行输出的 TOKEN列,对应加入集群命令参数 token
  • 第二行输出,对应加入集群命令参数 discovery-token-ca-cert-hash,一般不会变

替换参数后重新加入集群,到 master 节点,等待几分钟,直到 Ready

  1. [root@k8s-master k8s]# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master Ready master 2d4h v1.19.3
  4. k8s-node1 Ready <none> 118s v1.19.3

Dashboard

Dashboard不是必须的,但是有它可以省很多事:

  • 网页方式,查看集群 node/service/pod 等状态一目了然
  • 方便查看容器日志
  • 方便进入容器终端

安装

下载文件:

  1. wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

编辑文件 recommended.yaml

修改超时时间(默认900秒),在 - --namespace=kubernetes-dashboard 后添加行 - --token-ttl=86400

  1. 省略
  2. args:
  3. - --auto-generate-certificates
  4. - --namespace=kubernetes-dashboard
  5. - --token-ttl=86400
  6. 省略

暴露服务,改为 NodePort 方式,在 targetPort: 8443 后添加两行 nodePort: 30002type: NodePort:

  1. 省略
  2. spec:
  3. ports:
  4. - port: 443
  5. targetPort: 8443
  6. nodePort: 30002
  7. type: NodePort
  8. 省略

应用生效:

  1. kubectl apply -f recommended.yaml

然后,访问 https://master节点ip:30002即可,暂时还无法登录

用户

新建文件 dashboard-adminuser.yaml

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: admin-user
  5. namespace: kube-system
  6. ---
  7. apiVersion: rbac.authorization.k8s.io/v1
  8. kind: ClusterRoleBinding
  9. metadata:
  10. name: admin-user
  11. roleRef:
  12. apiGroup: rbac.authorization.k8s.io
  13. kind: ClusterRole
  14. name: cluster-admin
  15. subjects:
  16. - kind: ServiceAccount
  17. name: admin-user
  18. namespace: kube-system

应用生效:

  1. kubectl apply -f dashboard-adminuser.yaml

Token

获取 token:

  1. kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

生成的 token 可以保存到文件,打开 dashboard 网页,输入 token,即可登录:

Chrome导入证书

暂时没发现什么用途,跳过吧

需要访问 dashboard 网页的电脑,拷贝证书文件 kubecfg.p12 后,手动导入证书:

打开Chrome - 设置 - 隐私设置和安全性 - 安全 - 管理证书 - 导入 - 选择证书文件 - 输入证书密码

然后访问,就会弹窗提示有可用证书

客户端

证书

证书可以用来远程访问集群

  • 假设集群跑在服务器上,那么就可以从开发机器 kubectl 使用证书访问控制集群

因为初始化集群,已经将服务器的 kubectl 自动配置到集群 api server 了,所以使用服务器 kubectl 配置生成证书相关文件:

  1. grep 'certificate-authority-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.ca
  2. grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
  3. grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
  4. openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
  • 一共生成四个同名不同后缀的文件, 请 保存
  • 生成证书需要输入 密码,请 记住

配置

客户端访问远程集群,需要下载和服务器相同版本的 kubectl

  1. curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.19.3/bin/linux/amd64/kubectl
  2. chmod +x kubectl
  3. sudo mv kubectl /usr/bin/

参考 kubectl 通过配置文件添加上下文访问远程集群 配置集群证书

  • 这里我们的集群地址是 https://192.168.1.114:6443
  • 证书文件,从服务器拷贝到本地 /home/wood/kubrenetes/114/
  • 这里将这个上下文,取名 114,以后可以使用这个名字切换已配置的不同的集群 kubectl config use-context 114
  1. kubectl config set-cluster only-k8s --server https://192.168.1.114:6443 --certificate-authority=/home/wood/kubrenetes/114/kubecfg.ca
  2. kubectl config set-credentials kubernetes-admin --client-certificate=/home/wood/kubrenetes/114/kubecfg.crt --client-key=/home/wood/kubrenetes/114/kubecfg.key
  3. kubectl config set-context 114 --cluster=only-k8s --namespace=default --user=kubernetes-admin
  4. kubectl config use-context 114

然后测试,能否访问集群:

  1. kubectl version
  2. kubectl get nodes
发布内容,请遵守相关法律法规。
评论