一个k8s集群主要由控制节点(master)和工作节点(node)组成。
控制节点(master):
ETCD: 可信赖的分布式键值存储服务,能够为整个分部署集群存储一些关键的数据,储存k8s集群所有的重要信息(持久化),协助分布式集群的正常运行。
ApiServer: 所有服务访问的统一入口,接收用户输入命令,提供认证,授权,API注册和发现等机制。
**CrontrollerManager: ** 负责维护集群的状态,比如程序的部署安排,故障检测,自动扩展,滚动更新等。
**sheduler: ** 负责集群的调度,选择合适的节点进行分配任务(计算如何调度)。
工作节点node:
**Kubelet: ** 直接跟容器引擎交互实现容器的生命周期管理。(工作在node节点,等待接活)
**Kube-proxy: ** 负责写入规则至 Iptables, 负载均衡IPVS实现服务映射访问。
以nginx实例来讲解组件间调用关系:
其他组件:
**CoreDNS: ** 可以为集群中的SVC创建一个域名IP的对应关系解析
DASHBOARD: 给K8S提供一个B/S访问体系
**INGRESS CONTROLLER: ** 官方只能实现四层代理,Ingress 实现七层代理
**FEDETATION: ** 提供一个可以跨集群中心多K8S统一管理功能
**PROMETHEUS: ** 提供K8S集群的监控能力
**ELK: ** 提供k8s集群日志统一分析介入平台
注意:
master: 集群控制节点,每个集群至少一个master节点负责集群的管控
**node: ** 工作负载节点,由master节点分配,然后node节点上的docker负责容器的运行
**Pod: ** k8s的最小控制单元,容器都是运行在pod中的,一个pod可以有一个或多个容器
**Controller: ** 控制器,通过它来实现对pod的管理,比如启动pod,停止pod,伸缩pod的数量等。
Service: Pod对外服务的统一入口,维护多个pod。
Label: 标签,用于对pod进行分类,同一类的pod会有相同的标签
NameSpace: 命名空间,来隔离pod的运行环境。
安装方式
主机: centos7 * 3 , 一主两从,kubeadm安装
# 配置hosts
vim /etc/hosts
# 添加以下
192.168.0.115 master
192.168.0.117 node2
192.168.0.118 node3
# 时间同步(三台机器)
# k8s要求集群中节点时间必须精确一致,这里使用chronyd来从网络同步时间
systemctl start chronyd
systemctl enable chronyd
date
# 禁用iptables和firewalld服务
systemctl stop iptables
systemctl disable iptables
systemctl stop firewalld
systemctl disable firewalld
# 禁用selinux
vim /etc/selinux/config
SELINUX=disabled
# 禁用swap交换分区
swapoff -a # 临时禁用swap
vim /etc/fstab # 永久关闭,打开自动挂载的配置文件,将swap配置项注释掉
"""
# /dev/mapper/cl-swap swap swap defaults 0 0
"""
free -m # 验证
# 修改linux内核参数,添加网桥过滤和地址转发功能
vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 重新加载配置
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
# 配置ipvs功能
# 在k8s中service有两种代理模型,一种是基于iptables,一种基于ipvs,
# 两者比较,ipvs性能更好,但需要手动载入ipvs模块
# 1)安装ipset和ipvsadm
yum install ipset ipvsadmin -y
# 2)添加需要加载模块写入脚本文件
cat << EOF > /etc/sysconfig/modules/ipvs.modules
"""
#!bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
"""
# 3)为脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 4) 执行并查看是否模块加载成功
/bin/bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 重启服务器
reboot
# 安装docker, yum安装即可
# 修改配置文件
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://0gsacrb1.mirror.aliyuncs.com/"]
}
# 重启
systemctl restart docker
# 安装k8s
# 1. 换源
vim /etc/yum.repos.d/kubernetes.repo
"""
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
"""
# 2. 安装kubeadm, kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubectl-1.17.4-0 kubelet-1.17.4-0 -y
# 3. kubelet的cgroup
vim /etc/sysconfig/kubelet
"""
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
"""
# 4. 设置kubelet开机启动
systemctl enable kubelet
# 准备集群镜像
# 在安装k8s集群之前,需要提前准备好集群需要的镜像,所需镜像通过下面命令查看
kubeadm config images list
# 下载镜像(需要ke学上网)
# 这里是一种替代方案, 复制到shell执行
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
# 安装k8s镜像
# 在master节点执行
kubeadm init --kubernetes-version=v1.17.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.0.115
# 创建必要的文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看节点, 只有master节点
kubectl get nodes
# 在node节点执行
kubeadm join 192.168.0.115:6443 --token q4z6tz.91bti4zjtm1ssff5 --discovery-token-ca-cert-hash sha256:b85860a0a81c935f2c510a518a93919418bc9fc8c96105d146e65dfcd53b75fa
# 在master节点,查看节点,但状态是noready,需要安装网络插件
kubectl get nodes
# 退出集群(master节点)
kubectl delete nodes node2
# node节点
kubeadm reset
# 重新生成加入集群token
kubeadm token create --print-join-command
k8s的网络插件,支持多种,比如flannel,calico,canal等等,这里选择flannel
# 下面操作只需要在master节点,插件使用daemonSet控制器,会在每个节点都运行
# 获取fannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改配置文件中quay.io仓库为 quay.mirror.qiniu.com,
# 使用配置文件启动fannel
kubectl apply -f kube-flannel.yml
# 稍等,查看节点的状态
kubectl get nodes
"""
NAME STATUS ROLES AGE VERSION
master Ready master 3h9m v1.17.4
node2 Ready <none> 166m v1.17.4
node3 Ready <none> 3h5m v1.17.4
"""
# 此时集群搭建完成
# 一下操作在master操作
# 部署nginx
kubectl create deployment nginx --image=nginx:1.14
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务
kubectl get pods,svc # 参看pods和service
"""
NAME READY STATUS RESTARTS AGE
pod/nginx-6c748d4965-lg5tj 1/1 Running 0 95s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9m48s
service/nginx NodePort 10.98.52.168 <none> 80:32699/TCP 75s
"""
# 最后访问部署的nginx服务
curl 192.168.0.115:32599
在k8s中,所有的内容都抽象为资源,用户需要通过操作资源来管理k8s。
k8s的本质就是一个集群系统,用户可以在集群中部署各种服务,所有的部署服务,就在在k8s中运行一个个的容器,并将制定的程序跑在容器中。
k8s的最小的管理单元是pod而不是 容器,所以只能将容器放在pod中,而k8s也不会直接管理pod,而是有Pod控制器来管理Pod。
Pod可以提供服务之后,就要考虑如何访问Pod中的服务,k8s通过Service资源,实现这个功能。
此外k8s还提供了各种存储系统,以为了Pod中的数据需要持久化。
语法:
#
表示注释:
后加空格---
一个文件,两个配置实例:
person:
name: zs
age: 29
car:
- baom
- benc
---
person:
name: lisi
三种方式:
命令式对象管理(用于测试环境): 直接使用命令【这里的run】去操作k8s的资源
实例:kubectl run nginx-pod --image=nginx:1.14 --port=80
命令式对象配置: 通过命令【这里的create】配置 和 配置文件去操作k8s的资源 (命令+配置文件)
实例: kubectl create -f nginx-pod.yml
声明式对象配置: 通过apply命令【apply只用于创建和更新资源】和配置文件去操作k8s的资源
实例:kubectl apply -f nginx-pod.yml
kubectl是k8s集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用部署,kubectl命令格式如下:
kubectl [command] [type] [name] [flags]
command: 指定要对资源执行的操作,例如create、get、delete、expose、run
type: 指定资源类型。 比如deployment, pod, service
name: 指定资源的名称,大小写敏感
flags: 指定额外的可选参数
实例:
kubectl get pods # 查看所有pod
kubectl get pod pod_name # 查看指定pod
kubectl get pod pod_name -o yaml # 以yaml形式展示结果
kubectl get pod pod_name -o wide # 详细查看
kubectl get pod pod_name -o json # json形式查看
command 常用命令
type类型
实例:
# 创建一个namespace
kubectl create ns dev
# 查看创建的名为dev的ns
kubectl get ns
"""
NAME STATUS AGE
default Active 52m
dev Active 4s
kube-node-lease Active 52m
kube-public Active 52m
kube-system Active 52m
"""
# 在集群上运行一个指定镜像
kubectl run pod --image=nginx:1.17.1 -n dev # -n 参数指定命名空间,推荐使用create创建
# 查看在指定命名空间的pods
kubectl get pods -n dev
# 详细信息
kubectl describe pod pod-cbb995bbf-fnxxz -n dev
# 删除pod
kubectl delete pod pod-cbb995bbf-fnxxz -n dev
# 删除命名空间
kubectl delete ns dev
使用命令+配置文件来操作k8s的资源
# 1) 创建nginxpod.yml文件
"""
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: mydev
spec:
containers:
- name: nginx-containers
image: nginx:1.17.1
"""
# 2) 执行create命令创建资源
kubectl create -f nginxpod.yml # 此时创建两个资源对象,分别为ns和pod
# 3) 查看资源
kubectl get -f nginxpod.yml
"""
NAME STATUS AGE
namespace/dev Active 49s
NAME READY STATUS RESTARTS AGE
pod/mydev 1/1 Running 0 49s
"""
# 4) 删除资源
kubectl delete -f nginxpod.yml
通过apply命令【apply只用于创建和更新资源】 + 配置文件操作k8s的资源
# 1) 创建资源
kubectl apply -f nginxpod.yml
# 2) 在一次执行,发现资源没有变动
kubectl apply -f nginxpod.yml
"""
namespace/dev unchanged
pod/mydev unchanged
"""
# 3) 此时改动nginxpod.yml的nginx版本为1.17.2,然后查看详细信息
kubectl describe pod mydev
"""
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m12s default-scheduler Successfully assigned default/mydev to node3
Normal Pulled 2m10s kubelet, node3 Container image "nginx:1.17.1" already present on machine
Normal Killing 38s kubelet, node3 Container nginx-containers definition changed, will be restarted
Normal Pulling 38s kubelet, node3 Pulling image "nginx:1.17.2"
Normal Created 10s (x2 over 2m10s) kubelet, node3 Created container nginx-containers
Normal Started 10s (x2 over 2m10s) kubelet, node3 Started container nginx-containers
Normal Pulled 10s kubelet, node3 Successfully pulled image "nginx:1.17.2"
"""
问题:
如果已经创建,再次执行kubectl create
则会报错
问kubectl
可以在node节点执行吗?
答:kubectl运行在node节点需要进行配置,配置文件在$HOME/.kube
,如果想要在node节点执行,需要将配置文件复制到node节点,即scp -r ~/.kube node1:~/
,此时node就可以像master一样执行命令。
使用推荐
kubectl apply -f xx.yml
kubectl delete -f xx.yml
kubectl get(describe) 资源名称
原文:https://www.cnblogs.com/xuexishiguang/p/14775423.html