Kubernetes 必知基础概念

Kubernetes 基础入门

K8S概念

声名式语法

例:

写一个愿望清单:

  • 启动3个容器
  • centos系统
  • 1核
  • 2G

Kubernetes参考网站

官网:https://kubernetes.io/

官方文档:https://kubernetes.io/zh/docs/home/

官方介绍:https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/

kubeadm官方文档:https://kubernetes.io/zh/docs/setup/production-environment/tools/

docker官方文档:https://docs.docker.com/

prometheus官方文档:https://prometheus.io/docs/introduction/overview/

ansible安装k8s项目:https://github.com/easzlab/kubeasz

阿里云ACK:https://cn.aliyun.com/product/kubernetes

什么是K8S

TP

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目

为什么需要 Kubernetes,它能做什么?

容器是打包和运行应用程序的好方式。在生产环境中,你需要管理运行应用程序的容器,并确保不会停机。 例如,如果一个容器发生故障,则需要启动另一个容器。如果系统处理此行为,会不会更容易?

这就是 Kubernetes 来解决这些问题的方法! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移、部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary 部署。

Kubernetes功能

  • 服务发现和负载均衡

    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚

    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算

    Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。

  • 自我修复

    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

K8S组件

TP

Master / 控制平面组件(Control Plane Components)

控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件

kube-apiserver

司令部,K8S的唯一入口,所有k8s操作指令,apiserver来接收

etcd

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

存储所有组件的数据

kube-scheduler

资源计算/任务调度

kube-controller-manager

运行控制器进程的控制平面组件,POD控制器,创建POD

cloud-controller-manager

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

Node

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

kubelet

一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。

客户端,接收创建任务,接收master上controller的资源,创建pod

kube-proxy

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

提供网络服务,负载均衡

容器运行时(Container Runtime)

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

docker等启动容器的应用

POD

K8S的最小单位,POD主要提供一个根容器,来给其它启动的容器提供资源

K8S核心资源

POD

  • 1、Pod是K8S的最小单位
  • 2、Pod的IP地址是随机的,删除Pod会改变IP
  • 3、Pod都有一个根容器
  • 4、一个Pod内可以由一个容器或多个容器组成
  • 5、一个Pod内的容器共享根容器的网络、名称空间、和文件系统卷
  • 6、一个Pod内的网络地址由根容器提供

POD运行状态

状态 描述
Pending(等待) Pod已经被K8S系统接受,但是有一个或多个容器,尚未创建,亦未运行。此阶段包括等待Pod被调度的时间和通过网络下载镜像的时间
Running(运行) Pod已经绑定到某个节点(node),Pod中所有容器都已被创建,至少有一个容器仍在运行,或者处于启动或重启状态
Succeeded(成功) Pod中所有容器都已成功终止,并且不会再重启
Failed(失败) Pod中所有容器都已成功终止,并且有一个容器是因为失败而终止
Unknown(未知) 因为某些原因无法获取Pod状态,这种情况,通常是因为与Pod所在主机通信失败

Services

Service也是K8S核心资源之一,Service定义了服务的入口地址,用来将后端的Pod服务暴露给外部的用户访问。

  • Node IP
    • 物理节点的IP
  • Cluster IP
    • 在POD之上封装了一层IP地址
  • POD IP
    • 每个POD的IP地址,可变

标签Label

Label标签是K8S中非常重要的一个属性,Label标签就像身份证一样,可以用来识别K8S的对象。

传统架构中,不同的服务应用之间通讯,都是通过IP和端口,但是在K8S中很多匹配关系都是通过标签来找。

Namespace

Namespace(名称空间)是K8S中非常重要的一个概念,Namespace将集群内部的资源进行隔离划分。

资源隔离 划分,在Namespace中,形成逻辑上的不同项目组或用户组。

controller 控制器

Controller用来管理Pod。

Pod控制器的种类有很多:

  • RC Replication Controller 控制Pod有多个副本
  • RS ReplicaSet RC控制器的升级版
    • 可控制pod数量及启动
  • Deployment 推荐使用,功能强大,包含了RS控制器
  • DaemonSet 保证所有的Node节点上,有且只有一个Pod运行
  • StatefulSet 有状态的应用,为Pod提供唯一标识,它可以保证部署和scale的顺序

K8S实战部署

部署环境准备

主机名 IP 角色 配置推荐 安装软件
db01 10.0.0.51 master 1C4G40G API Server、Controller、Scheduler、Kube-proxy、Kubelet、etcd、Kubectl、Kubeadm
db02 10.0.0.52 node1 1C2G40G Docker、Kubelet、Kube-proxy
db03 10.0.0.53 node2 1C2G40G Docker、Kubelet、Kube-proxy

IP规划

三种Service IP
Pod IP 10.2.0.0
Cluster IP 10.1.0.0
Node IP 10.0.0.0

安装方式

## K8S的方式有一堆
二进制安装 生产推荐,也不是很推荐
kubeadm 学习实验
网友写的Ansible二进制安装 非常牛逼~~~
第三方安装工具 Rancher
云服务的K8S安装 阿里云ACK

快速安装

安装前戏(所有节点)
  • 禁用K8S交换分区(swap)
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
  • 允许 iptables 检查桥接流量

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将net.bridge.bridge-nf-call-iptables 设置为 1。

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
  • 做hosts解析
cat >> /etc/hosts <<EOF
10.0.0.51 master
10.0.0.52 node1
10.0.0.53 node2
EOF

# 检查连接是否通畅
sudo sysctl --system
  • 配置阿里云的源
base源
epel源

# 需要yum-utils
yum install -y yum-utils

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/dockerce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/dockerce.repo
  • 做时间同步
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
  • 关闭swap
swapoff -a

# 删除
sed -i '/swap/d' /etc/fstab

# 注释
[root@db01 ~]$ vim /etc/fstab
UUID=5824d144-2a85-4751-b760-e6c348206a92 /                       xfs     defaults        0 0
UUID=275b0ab8-b594-45d5-b191-04f1ec71edb6 /boot                   xfs     defaults        0 0
#UUID=05f5ce98-3121-4073-836c-2bee62bb7ea2 swap                    swap    defaults        0 0
  • 加载IPVS模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#! /bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

# 执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules

# 执行一下该脚本
source /etc/sysconfig/modules/ipvs.modules

# 检查,有以下信息就成功
[root@db01 ~]$ lsmod|grep -e 'ip_vs' -e 'nf_conntrack_ipv'
nf_conntrack_ipv4      15053  9 
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
ip_vs_sh               12688  0 
ip_vs_wrr              12697  0 
ip_vs_rr               12600  4 
ip_vs                 145497  10 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          133095  7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
libcrc32c              12644  4 xfs,ip_vs,nf_nat,nf_conntrack

  • 安装指定版本的Docker
# 检查docker可安装版本
yum list docker-ce --showduplicates

# 安装docker
yum install -y docker-ce-19.03.15 docker-ce-cli-19.03.15
  • 设置docker镜像加速和cgroup
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

## 启动docker
systemctl start docker
systemctl enable docker
  • 部署kubeadm
# 1.更换国内源
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=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

# 2.安装k8s组件
yum install kubelet-1.19.3 kubeadm-1.19.3  kubectl-1.19.3  ipvsadm -y

# 3.启动kubelet
systemctl enable kubelet
systemctl start kubelet

master节点操作
# 初始化集群
kubeadm init \
--apiserver-advertise-address=10.0.0.51 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.19.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU


# 保存执行结果信息
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

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 10.0.0.51:6443 --token 64d459.t35p3hgjd9q36ojq \
    --discovery-token-ca-cert-hash sha256:3402ef1ed6ecf04f59b82aab34476d8b1a095994dc06b19e7459de51c654de13 


# 查看当前节点
kubectl get nodes
NAME   STATUS     ROLES    AGE     VERSION
db01   NotReady   master   5h19m   v1.19.3


# 执行上面系统给的命令,每个人的都不一样
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
############################################ node 节点执行部分 #############################################
# 将node节点添加到集群
kubeadm join 10.0.0.51:6443 --token 64d459.t35p3hgjd9q36ojq \
    --discovery-token-ca-cert-hash sha256:3402ef1ed6ecf04f59b82aab34476d8b1a095994dc06b19e7459de51c654de13
    
[root@db01 ~]$ kubectl get nodes
NAME   STATUS     ROLES    AGE   VERSION
db01   NotReady   master   20h   v1.19.3
db02   NotReady   <none>   20h   v1.19.3
db03   NotReady   <none>   20h   v1.19.3
###########################################################################################################



# 修改默认防火墙为ipvs
kubectl edit cm kube-proxy -n kube-system
修改 mode:"" 为 mode:"ipvs"


# 删除容器并重启
kubectl -n kube-system get pod|grep kube-proxy|awk '{print "kubectl -n kube-system delete pod "$1}'|bash


# 拉取代码
yum install -y git
## 二选一
git clone --depth 1 https://github.com/coreos/flannel.git
git clone --depth 1 git://github.com/coreos/flannel.git

# 打通网络
[root@db01 ~]$ ll
drwxr-xr-x  14 root root 4096 Nov 23 13:18 flannel
[root@db01 ~]$ cd /root/flannel/Documentation/
[root@db01 Documentation]$ vim kube-flannel.yml
  net-conf.json: |
    {
      "Network": "10.2.0.0/16",		## /修改这行配置
      "Backend": {
        "Type": "vxlan"
      }
    }

      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.15.1
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        - --iface=eth0		## /添加这一行配置
        
[root@db01 Documentation]$ kubectl apply -f kube-flannel.yml



# 查看kube-system名称空间中的POD状态
kubectl -n kube-system get pod



# k8s命令补全黑科技
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash > /etc/bash_completion.d/kubectl
posted @ 2023-05-11 09:51  AnOldSong  阅读(56)  评论(0编辑  收藏  举报