一、kubernetes的基本概念
1.kubernetes
Kubernetes 是一个开源的开源的分布式编排技术,Kubernetes 致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台,其遵循主从式架构设计、组件可以分为工作节点 (Node) 组件,和控制平面组件。
主要用途:
自动化部署,扩展,管理容器;
资源调度;
部署管理;
服务发现;
扩容缩容;
监控。(检测硬件系统及服务进程)
2. kubernetes优势
(1)docker缺点
宿主机宕机造成宿主机容器不可用,无法自动修复。
容器正在运行,接口连接不上
应用程序部署,回滚,扩缩容困难。
容器较多时涉及的端口难以维护。
(2)k8s的优势
管理大量跨主机容器
快速部署和扩容应用
无缝对接应用功能
节省资源,优化硬件
3.kubernetes架构解析
由图可知,Kubernetes 架构可以简单分为主 (master) 节点,从 (worker/node) 节点和数据库 ETCD。其中主节点为集群的控制单元,一般不会运行业务应用程序,主要包含的组件Kube-APIServer、Kube-ControllerManager、Kube-Scheduler。从节点为工作节点,也就是部署应用程序容器的节点,主要包含的组件有 Kubelet、Kube-Proxy、容器,当然如果 master 节点也要部署容器,也会包含这两个组件。
Master节点组件是k8s中集群控制节点
- API server 是控制枢纽,用于模块之间数据交换,将信息存储到ETCD
- Scheeduler 主要用于资源调度
- Controller Manager 主要负责集群的状态
- ETCD 负责存储集群的数据,是持久的,轻量级的分布式非关系型数据库,ETCD应至少为3个节点(奇数台避免选举平票和脑裂发生)
Node节点组件也称为worker节点,主要负责部署容器主机
- kubelet 是node上的核心组件,负责维护pod的生命周期。是pod和API主要实现者,负责驱动容器的执行层
- kube-proxy主要负责网络代理和负载均衡
4.kubenetes网络插件
CNI(容器网络接口) 是一个云原生计算基金会项目,它包含了一些规范和库,用于编写在Linux 容器中配置网络接口的一系列插件。CNI 只关注容器的网络连接,并在容器被删除时移除所分配的资源。
Kubernetes 使用 CNI 作为网络提供商和 Kubernetes Pod 网络之间的接口。
(1)Flannel 网络
由Coreosk 开发的一个项目,很多部署工具或者 k8s 的发行版都是默认安装,flannel 是可以用集群现有的 etcd,利用 api 方式存储自身状态信息,不需要专门的数据存储,是配置第三层的ipv4 0verlay 网络,在此网络内,每个节点一个子网,用于分配 ip 地址,配置 pod 时候,节点上的网桥接口会为每个新容器分配一个地址,同一主机中的 pod 可以使用网桥通信,不同主机的 pod流量封装到udp数据包中,路由到目的地。
Flannel 通过每个节点上启动一个 flnnel 的进程,负责给每一个节点上的子网划分、将子网网段等信息保存至 etcd,具体的报文转发是后端实现,在启动时可以通过配置文件指定不同的后端进行通信,目前有UDP、VXLAN、host-gatway 三种,VXLAN 是官方推荐,因为性能良好,不需人工干预。UDP、VXLAN 是基于三层网络即可实现,host-gatway 模式需要集群所有机器都在同一个广播域、就是需要在二层网络在同一个交换机下才能实现,host-gateway 用于对网络性能要求较高的常见,需要基础网络架构支持,UDP 用于测试或者不支持 VXLAN 的 nux 内核。反正一般小规模集群是完全够用的,直到很多功能无法提供时在考虑其他插件。
(2)Calico 网络
虽然 falnnel 很好,但是 calico 因为其性能、灵活性都好而备受欢迎,calico 的功能更加全面,不但具有提供主机和 pod 间网络通信的功能,还有网络安全和管理的功能,而且在 CNI 框架之内封装了 calico 的功能,calico 还能与服务网络技术 Istio 集成,不但能够更加清楚的看到网络架构也能进行灵活的网络策略的配置,calico 不使用 overlay 网络,配置在第三层网络,使用 BGP路由协议在主机之间路由数据包,意味着不需要包装额外的封装层。主要点在网络策略配置这一点可以提高安全性和网络环境的控制。
如果集群规模较大,选择 calico 没错,当然 calico 提供长期支持,对于一次配置长期使用的目的来说,是较好的选择。
二、实验部署
1.配置基础环境
三个节点依次部署
[root@localhost ~]# hostnamectl set-hostname k8s-master (101)
[root@localhost ~]# bash
[root@localhost ~]# hostnamectl set-hostname k8s-node01 (102)
[root@localhost ~]# hostnamectl set-hostname k8s-node02 (103)
[root@k8s-master ~]# vim /etc/hosts
192.168.10.101 k8s-master
192.168.10.102 k8s-node01
192.168.10.103 k8s-node02
[root@k8s-master ~]# swapoff -a (关闭交换分区)
[root@k8s-master ~]# vim /etc/fstab (永久关闭)
#/dev/mapper/centos-swap swap swap defaults 0 0
配置kubenetes仓库
cat <<EOF> /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@k8s-master ~]# yun clean all
[root@k8s-master ~]# yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
[root@k8s-master ~]# systemctl enable kubelet (开机自启)
备注:
k8s安装完成之后,通过systemctl start kubelet 无法启动,需要进行初始化完成之后才可以启动成功。
2.初始化配置文件
操作节点 k8s-master
[root@k8s-master ~]# kubeadm config print init-defaults > init-config.yaml (生成初始化配置文件)
备注:
kubeadm config view: 查看当前集群中的配置值
kubeadm config print join-defaults: 输出 kubeadm join 默认参数文件的内容
kubeadm config images list: 列出所需的镜像列表
kubeadm config images pull: 拉取镜像到本地。
kubeadm config upload from-flags: 由配置参数生成 ConfigMap。
[root@k8s-master ~]# vim init-config.yaml
localAPIEndpoint:
advertiseAddress: 192.168.10.101 #12
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: k8s-master #17
taints: null
.......
imageRepository: registry.aliyuncs.com/google_containers #30
podSubnet: 10.244.0.0/16
备注:
serviceSubnet: 指定使用 ipvs 网络进行通信,ipvs 称之为 IP 虚拟服务器(IP Virtual Server.简写为 IPVS)。是运行在 LVS 下的提供负载平衡功能的一种技术。含义 IPVS 基本上是一种高效的Layer-4 交换机
podSubnet 10.244,0.0/16 参数需要和后文中 kube-flannel.ymI 中的保持一致,否则,可能会使得 Node 间 Cluster IP 不通。
默认情况下,每个节点会从 PodSubnet 中注册一个掩码长度为 24 的子网,然后该节点的所有 podip 地址都会从该子网中分配。
#拉取所需要的镜像(三个节点都要拉取)
初始化(操作节点在k8s-master)
[root@k8s-master ~]# kubeadm init --config=init-config.yaml (初始化)
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.10.101:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:ad34e21de7053cbfc56dd8c61d81f80e27d9a9b7f99fb117a43a7b78547afd14
备注:
在master生成令牌,在node上直接复制,持此令牌node节点可以加入进来。
配置文件到home目录
导出为全局变量
[root@k8s-master ~]# kubectl get nodes (在k8s-master上检查节点)
[root@k8s-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6d8c4cb4d-tv5ql 0/1 Pending 0 14m
kube-system coredns-6d8c4cb4d-wxdd2 0/1 Pending 0 14m
kube-system etcd-k8s-master 1/1 Running 0 14m
kube-system kube-apiserver-k8s-master 1/1 Running 0 14m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 14m
kube-system kube-proxy-ksfxx 1/1 Running 0 14m
kube-system kube-proxy-pk5r4 1/1 Running 0 13m
kube-system kube-proxy-t69ks 1/1 Running 0 12m
kube-system kube-scheduler-k8s-master 1/1 Running 0 14m
部署calico网络插件 可以提前下载直接部署。
[root@k8s-master ~]# kubectl apply -f calico.yaml
[root@k8s-master ~]# docker images (查看镜像)
[root@k8s-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-64cc74d646-b7n2b 1/1 Running 0 4m25s
kube-system calico-node-22mbr 1/1 Running 0 4m25s
kube-system calico-node-nxnm8 1/1 Running 0 4m25s
kube-system calico-node-pvv49 1/1 Running 0 4m25s
kube-system coredns-6d8c4cb4d-tv5ql 1/1 Running 0 24m
kube-system coredns-6d8c4cb4d-wxdd2 1/1 Running 0 24m
kube-system etcd-k8s-master 1/1 Running 0 24m
kube-system kube-apiserver-k8s-master 1/1 Running 0 24m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 24m
kube-system kube-proxy-ksfxx 1/1 Running 0 24m
kube-system kube-proxy-pk5r4 1/1 Running 0 23m
kube-system kube-proxy-t69ks 1/1 Running 0 23m
kube-system kube-scheduler-k8s-master 1/1 Running 0 24m
下载Metrics-server的yaml文件
https://github.com/kubernetes-sigs /metlcs-server/releases/download/v9.6.3/com
ponents . yaml
[root@k8s-master ~]# vim components.yaml
k8s-app: metrics-server
spec:
containers:
- args:
- --kubelet-insecure-tls #135添加
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.3 #141
imagePullPolicy: IfNotPresent
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 28m v1.23.0
k8s-node01 Ready <none> 27m v1.23.0
k8s-node02 Ready <none> 26m v1.23.0
[root@k8s-master ~]# kubectl create -f components.yaml
[root@k8s-master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master 292m 14% 1698Mi 44%
k8s-node01 108m 5% 1569Mi 41%
k8s-node02 309m 15% 1061Mi 27%
部署Dashboard
[root@k8s-master ~]# mkdir -p /opt/k8s/dashboard
[root@k8s-master ~]# cd /opt/k8s/dashboard/
上传所需要的yaml文件
[root@k8s-master dashboard]# ls
dashboard-user.yaml dashboard.yaml
[root@k8s-master dashboard]# kubectl create -f .
[root@k8s-master ~]# kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard (修改端口号)
- nodePort: 31245
[root@k8s-master ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') (生成token)
[root@k8s-master ~]# vim token (将生成的token写入,方便登录)
安装helm客户端
[root@k8s-master ~]# tar zxvf helm-v3.9.4-linux-amd64.tar.gz
[root@k8s-master ~]# ls
anaconda-ks.cfg components.yaml images install_docker_ali-yum.sh token
calico.yaml helm-v3.9.4-linux-amd64.tar.gz init.config.yaml linux-amd64
[root@k8s-master ~]# cd linux-amd64/
[root@k8s-master linux-amd64]# ls
helm LICENSE README.md
[root@k8s-master linux-amd64]# mv helm /usr/local/bin/
[root@k8s-master linux-amd64]# helm version
version.BuildInfo{Version:"v3.9.4", GitCommit:"dbc6d8e20fe1d58d50e6ed30f09a04a77e4c68db", GitTreeState:"clean", GoVersion:"go1.17.13"}
命令优化
[root@k8s-master ~]# vim .bashrc
alias ku='kubectl'
[root@k8s-master ~]# source .bashrc
[root@k8s-master ~]# ku get pod -A (可以直接使用ku)