前言

学习一项新技术,我们都要经历几个步骤:了解技术的产生背景-》技术的基础知识框架-》项目环境操练-》结合理论知识-》归纳总结,最后形成自己的一个技术经验。

对于学习技术的个人来说,搭建自己的一套学习环境会是一个坎。这里想分享自己一个环境搭建过程的经验以及过程中自己遇到一些觉得值得分享的问题处理过程。

内容包括:

  • k8s的基础知识;
  • 使用kubeadm工具搭建k8s平台。

学习要求:

  • linux系统基础(文件编辑,软件管理)
  • 容器基础知识(了解docker容器管理)


一、k8s的基础知识(简单了解即可)

组件介绍:​​官方链接​

交付正常运行的 Kubernetes 集群所需的各种组件包括:


一些组件


  • 控制平面组件(Control Plane Components)

控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 ​replicas​​​ 字段时,启动新的 ​pod​​​)。

API 服务器是 Kubernetes ​控制面​​​的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。

  • etcd

etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。

  • kube-scheduler

控制平面组件,负责监视新创建的、未指定运行​节点(node)​​​的 ​Pods​​​,选择节点让 Pod 在上面运行。

  • kube-controller-manager

运行​​​控制器​​​进程的控制平面组件。从逻辑上讲,每个​​控制器​​都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。

搭建和学习k8s容器平台_docker


  • cloud-controller-manager

云控制器管理器是指嵌入特定云的控制逻辑的 ​控制平面​​​组件。 云控制器管理器使得你可以将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。

  • Node 组件

节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

  • kubelet

​kube-proxy​​​ 是集群中每个节点上运行的网络代理, 实现 Kubernetes ​服务(Service)​​​ 概念的一部分。

kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了数据包过滤层并可用的话,kube-proxy 会通过它来实现网络规则。否则, kube-proxy 仅转发流量本身。

  • Container Runtime

容器运行环境是负责运行容器的软件。

Kubernetes 支持多个容器运行环境: ​​Docker​​​、 ​​containerd​​​、​​CRI-O​​​ 以及任何实现 ​​Kubernetes CRI (容器运行环境接口)​​。

  • 其他组件:插件(Addons)、DNS、Web 界面(仪表盘)、容器资源监控、集群层面日志。


二、k8s环境搭建

2.1 搭建准备

  1. VMware station 12 pro

实验需要创建​虚机3台​:参数3G内存、2核处理器、50G存储空间。

master节点: source01

node节点: source02、source03

要能​访问外网​环境,可以通过​克隆方式创建​多台,但得注意修改​网卡的uuid信息不能一致​(修改/etc/sysconfig/network-scripts/ifcfg-ens33中配置并重启网络服务)或者删除网卡中的UUID并重启网络服务。

搭建和学习k8s容器平台_Kubernetes_02

2.2 初始化系统环境(三台虚机都要):

关闭防火墙和selinux
# systemctl stop firewalld ; systemctl disable firewalld
# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

关闭swap分区
# swapoff -a
注释掉swap挂载信息
# vim /etc/fstab
修改前: /dev/mapper/centos-swap swap swap defaults 0 0
修改后: #/dev/mapper/centos-swap swap swap defaults 0 0

修改内核参数。 br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。
# modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile
# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# sysctl -p /etc/sysctl.d/k8s.conf

安装kubeadm、docker-ce可以在线也可以离线,
离线方式:
配置kubeadm、docker-ce的离线yum源,前提是本地已经下载好离线包,压缩在k8s-docker.tar.gz里
# tar xf k8s-docker.tar.gz -C /opt/
# tee /etc/yum.repos.d/k8s-docker.repo << 'EOF'
[k8s-docker]
name=k8s-docker
baseurl=file:///opt/k8s-docker
enabled=1
gpgcheck=0
EOF
在线方式:
配置阿里云Kubernetes yum源
[root@xuegod63 ~]# tee /etc/yum.repos.d/kubernetes.repo << 'EOF'
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

安装kubeadm组件,用于后期安装k8s使用,现在还没有安装k8s
#yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4
在线源安装一定要指定版本,否则安装最新版,软件版本要和将要安装的k8s集群版本一致。
# yum install -y kubelet-1.20.4 kubeadm-1.20.4 kubectl-1.20.4
说明:
kubelet :运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm :用于初始化集群,启动集群的命令工具
kubectl :用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

安装docker-ce服务。
# yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker-ce
# yum install docker-ce docker-ce-cli containerd.io -y
# systemctl start docker && systemctl enable docker

添加阿里云镜像加速地址并修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认则为systemd
# tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": ["https://rncxm540.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker

kubelet   :运行在集群所有节点上,用于启动Pod和容器等对象的工具

kubeadm :用于初始化集群,启动集群的命令工具

kubectl    :用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件


2.3 master节点上使用kubeadm初始化k8s集群

# kubeadm init --kubernetes-version=1.20.4 \
--apiserver-advertise-address=192.168.1.63 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

注:--image-repository registry.aliyuncs.com/google_containers为保证拉取镜像不到国外站点拉取,手动指定仓库地址为registry.aliyuncs.com/google_containers。kubeadm默认从k8ss.grc.io拉取镜像。 我本地有导入到的离线镜像,所以会优先使用本地的镜像。

初始化之后,按照提示需要执行:

# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl get nodes

记录node节点后面加入的命令

kubeadm join 192.168.1.63:6443 --token rgz2ww.cmx4k1otzsizgzf2 \
--discovery-token-ca-cert-hash sha256:d8870af95b20d2c3aef441994603f3e1d71a5edde1b038df1e0f0c8754a43ecb

总的来说,安装k8s过程包括:

  • 安装docker   yum install docker-ce
  • 安装kubeadm   yum  install kubeadm
  • 使用kubeadm初始化k8s集群 kubeadm init


2.4 安装kubernetes网络组件-Calico

# kubectl apply -f /root/calico.yaml
注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml

检查集群情况(Ready则正常)
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xuegod63.cn Ready control-plane,master 26m v1.20.4


2.5 安装-2.0

操作虚机:master

​kubernetes-dashboard2.0yaml文件地址: ​

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

很多时候官方的资源我们不能够直接访问,可以通过浏览器访问并使用ctrl+s进行保存,然后上传使用。

修改yaml文件

# vim recommended.yaml

在第42行下方添加2行

      nodePort: 30000

  type: NodePort

增加完后,如下:

搭建和学习k8s容器平台_Kubernetes_03

默认的dashboard是没有配置NodePort的映射的。

​添加dashboard管理员用户凭证,在原文件中追加以下内容:​

# cat >> recommended.yaml << EOF
---
# ------------------- dashboard-admin ------------------- #
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
EOF


安装dashboard
# kubectl apply -f recommended.yaml
# kubectl get pods --all-namespaces

查看登录令牌
# kubectl describe secrets -n kubernetes-dashboard dashboard-admin
...
token: eyJhbGciOiJSUzI1NiIsImtpZCI6Il9VZzZoWU5ZNFRBb2tBak50NzVFX3EzYjl6dnpSZnN1NlB2ckJHSXIxYTQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWvc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi10dmRnMiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyjM2YjRiZmI3LTNiZWYtNDM0MS04ZmIzLTI2OTdlODgyZTM3MiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.A841TIi773u38wnzhWYx5sT-SAhjxLVd7JrqWOsnUGNEdwt9gbYsPesJQjoinNNd9VZgpOFidwLVUone4gp46W-D1schDXNLVQevuhS3Ud4gXhBsbrLpUkToKMmkg6beJK0qJKQFBerF5Kz-8IOQBvwlat-PsbFdZgcFZRN7octYnEqcMGtl6Exh1qqGah-90J9xVY3E7IAUN2w2r1hx0D

搭建和学习k8s容器平台_docker_04

​token: 浏览器登录时使用以下token进行登录。​

token:     ​ e​yJhbGciOiJSUzI1NiIsImtpZCI6Il9VZzZoWU5ZNFRBb2tBak50NzVFX3EzYjl6dnpSZnN1NlB2ckJHSXIxYTQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWvc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi10dmRnMiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyjM2YjRiZmI3LTNiZWYtNDM0MS04ZmIzLTI2OTdlODgyZTM3MiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.A841TIi773u38wnzhWYx5sT-SAhjxLVd7JrqWOsnUGNEdwt9gbYsPesJQjoinNNd9VZgpOFidwLVUone4gp46W-D1schDXNLVQevuhS3Ud4gXhBsbrLpUkToKMmkg6beJK0qJKQFBerF5Kz-8IOQBvwlat-PsbFdZgcFZRN7octYnEqcMGtl6Exh1qqGah-90J9xVY3E7IAUN2w2r1hx0D

搭建和学习k8s容器平台_Kubernetes_05

搭建和学习k8s容器平台_docker_06

2.6 将node节点加入到master节点中

master上查看添加信息

kubeadm token create --print-join-command

# kubeadm token create --print-join-command
kubeadm join 192.168.137.128:6443 --token zn2sal.2xs5k1cbz7xeut3t --discovery-token-ca-cert-hash sha256:402989175a22b7779a776def8aa38a133c87deae15f0fec4210aba8d9e2a3036

node节点上执行以上查找出来的添加命令

# kubeadm join 192.168.137.128:6443 --token zn2sal.2xs5k1cbz7xeut3t     --discovery-token-ca-cert-hash sha256:402989175a22b7779a776def8aa38a133c87deae15f0fec4210aba8d9e2a3036

检查添加状态

[root@source01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
source01 Ready control-plane,master 4d5h v1.20.4
source02 Ready <none> 4d3h v1.20.4
source03 Ready <none> 4d3h v1.20.4

如何在普通的node节点上查看集群状态?

将master证书导入到node上,这样在node才可以使用kubectl命令管理k8s 
[root@source02 ~]]# mkdir ~/.kube
拷贝xuegod63的配置文件到xuegod64
[root@source01 ~]# scp ~/.kube/config source02:/root/.kube/

[root@source02 ~]# kubectl get nodes


三、Kubernetes 仪表板(Dashboard)

至此,我们完成了k8s的简单部署,可以开始尝试创建属于自己的项目。

关于​​Kubernetes 仪表板(Dashboard)​​的使用,也可以参考官方文档:

​https://kubernetes.io/zh/docs/tasks/access-application-cluster/web-ui-dashboard/​