K8s介绍和各组件盘点;搭建一个单机版的k8s

K8s介绍和各组件盘点;搭建一个单机版的k8s

Kubernetes官网 https://kubernetes.io/

用官网的话术介绍K8s:

Kubernetes(K8s),是用于自动部署、扩容、缩容和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes源自google 15年生产环境的运维经验,同时凝聚了社区最佳创意和实践。

简单讲,K8s就是一个生产级别的容器编排平台和集群管理系统,不仅能够创建、调度容器,还能够监控、管理服务器,它凝聚了Google和开源社区的集体智慧,从而让中小型公司也可以具备轻松运维海量计算节点——也就是“云计算”的能力。

K8s介绍和各组件盘点;搭建一个单机版的k8s_第1张图片

2.1 K8s核心组件

K8s介绍和各组件盘点;搭建一个单机版的k8s_第2张图片

1)Master节点

K8s介绍和各组件盘点;搭建一个单机版的k8s_第3张图片

  • API Server

​ Apiserver是整个K8s系统的唯一入口,以RESTful API提供接口服务,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信,可以说是 K8s里的联络员。

  • Controller-manager

​ 控制中心,负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能。

​ 因为节点状态和Pod信息都存储在etcd里,所以要通过apiserver获得信息,才能够实现对资源的各种操作。

  • Scheduler

​ 调度器,负责容器的编排工作,检查节点的资源状态,把Pod调度到最适合的节点上运行。

  • Etcd

​ 是一个高可用的分布式Key-Value数据库,用来持久化存储系统里的各种资源对象和状态。

​ 注意它只与apiserver有直接联系,也就是说任何其他组件想要读写etcd里的数据都必须经过apiserver。

2)Node节点

K8s介绍和各组件盘点;搭建一个单机版的k8s_第4张图片

  • Kubelet

​ 是Master在Node节点上的Agent,通过指挥容器引擎实现管理本机运⾏容器,⽐如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等⼯作。

  • Kube-proxy

​ 在Node节点上实现Pod⽹络代理,维护⽹络规则和四层负载均衡⼯作。

  • Container-runtime

​ 容器运行时,即容器引擎,例如docker、containerd、podman。是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理Pod的生命周期。

2.2 搭建一个单机版的k8s

机器建议配置:

2C 2G 50G

1)准备工作

关闭防火墙firewalld、selinux

设置主机名

设置/etc/hosts

关闭swap

swapoff -a 

永久关闭,vi /etc/fstab 注释掉swap那行

将桥接的ipv4流量传递到iptables链

modprobe br_netfilter   ##生成bridge相关内核参数

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 --system # 生效

时间同步

yum install -y chrony;
systemctl start chronyd;
systemctl enable chronyd
2)安装containerd

先安装yum-utils工具

yum install -y yum-utils 

配置Docker官方的yum仓库,如果做过,可以跳过

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装containerd

yum install containerd.io -y

启动服务

systemctl enable containerd
systemctl start containerd

生成默认配置

containerd  config default > /etc/containerd/config.toml

修改配置

vi  /etc/containerd/config.toml
sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8"   # 修改为阿里云镜像地址
SystemdCgroup = true  

设置镜像加速器(可选)

参考https://www.jianshu.com/p/a5561ce03609

重启containerd服务

systemctl restart containerd
3)配置kubernetes仓库
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

说明:kubernetes用的是RHEL7的源,和8是通用的

4)安装kubeadm和kubelet
yum install -y kubelet-1.25.4 kubeadm-1.25.4 kubectl-1.25.4

启动kubelet服务

systemctl start kubelet.service
systemctl enable kubelet.service
5)设置crictl连接 containerd
crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
6)初始化
kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.211.139 --kubernetes-version=v1.25.4  --service-cidr=10.15.0.0/16  --pod-network-cidr=10.18.0.0/16

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.211.139:6443 --token 0pufq3.8uosgbptgwnv2jfk \
        --discovery-token-ca-cert-hash sha256:a8b706d5bd608a7f49bd561d07eab08c2dcbc71d8b6797dbaea338ef2cb9d8a6 
7)创建目录
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 node 
kubectl get pod --all-namespaces
8)安装calico网络
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml -O

下载完后还需要修改⾥⾯定义 Pod ⽹络(CALICO_IPV4POOL_CIDR),与前⾯ kubeadm init 的 --podnetwork-cidr 指定的⼀样

vi calico.yaml

vim calico.yaml
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
# 修改为(前面的井号空格都要删掉):
- name: CALICO_IPV4POOL_CIDR
  value: "10.18.0.0/16"

部署

kubectl apply -f calico.yaml	#需要等待去下载镜像

查看

kubectl get pods -n kube-system
9)安装dashboard(可选)

下载yaml文件

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

如果无法下载,请到这里访问 https://gitee.com/aminglinux/linux_study/blob/master/k8s/recommended.yaml

修改

vi recommended.yaml

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard  ##这是第38行
spec:
  type: NodePort  ###添加这行,前面用空格补齐
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30002  ###添加这行,前面用空格补齐
  selector:
    k8s-app: kubernetes-dashboard

创建pod

kubectl apply -f recommended.yaml   #需要等待去下载镜像

查看

kubectl get pod -n kubernetes-dashboard
kubectl get svc -n kubernetes-dashboard

pendding状态

查看原因:

kubectl describe pod dashboard-metrics-scraper-748b4f5b9d-wbfm5 -n kubernetes-dashboard #pod后面一长串是复制的NAME(kubectl get pod -n kubernetes-dashboard)名称,要查看的是哪个

  Warning  FailedScheduling  3m16s  default-scheduler  0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.

这是因为master节点上不允许该pod部署,需要解除限制:

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

访问:

https://192.168.211.139:30002

chrome浏览器

该网站发回了异常的错误凭据。这可能是因为有攻击者在试图冒充

网页直接输入: thisisunsafe

K8s介绍和各组件盘点;搭建一个单机版的k8s_第5张图片

创建 service account 并绑定默认 cluster-admin 管理员集群⻆⾊:

# 创建用户
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
# 获取用户Token
kubectl create token dashboard-admin -n kubernetes-dashboard

使⽤输出的 token 登录 Dashboard。

10)crictl命令用法
镜像相关
镜像相关功能 Docker Containerd
显示本地镜像列表 docker images crictl images
下载镜像 docker pull crictl pull
上传镜像 docker push 无,例如buildk
删除本地镜像 docker rmi crictl rmi
查看镜像详情 docker inspect IMAGE-ID crictl inspecti IMAGE-ID
容器相关
容器相关功能 Docker Containerd
显示容器列表 docker ps crictl ps
创建容器 docker create crictl create
启动容器 docker start crictl start
停止容器 docker stop crictl stop
删除容器 docker rm crictl rm
查看容器详情 docker inspect crictl inspect
附加容器 docker attach crictl attach
执行命令 docker exec crictl exec
查看日志 docker logs crictl logs
查看容器资源 docker stats crictl stats
pod相关
POD 相关功能 Docker Containerd
显示 POD 列表 crictl pods
查看 POD 详情 crictl inspectp
运行 POD crictl runp
停止 POD crictl stopp

核心知识点/面试考点:
● Kubernetes集群有哪些核心组件?主要功能是?

扩展知识点:
Kubernetes(K8S)中文文档_Kubernetes中文社区 http://docs.kubernetes.org.cn/227.html

你可能感兴趣的:(Linux相关,kubernetes,容器,云原生)