Kubernetes 必知基础概念
Kubernetes 基础入门
K8S概念
声名式语法
例:
写一个愿望清单:
- 启动3个容器
- centos系统
- 1核
- 2G
Kubernetes参考网站
官方文档: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
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组件
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