一、k8s架构
架构图1.1 Master组件
- APIServer:集群的统一入口,各组件的协调者,以RESTful API、kubectl、Web UI提供接口服务,所有对象资源的增删查改和监听操作都交给APIServer处理后再交给Etcd存储。
- Controller Manager:管理k8s所有资源对象,一个资源对应一个控制器,Controller Manager就是管理这些控制器的,能保证资源处于预期状态,还能实现pod垃圾回收。
- Scheduler:负责资源调度,根据调度算法为新创建的Pod选择一个Node节点。
1.2 Node组件
- Kubelet:Kubelet是Master在Node节点上的Agent,管理本节点运行容器(Pod)的生命周期,比如创建容器、Pod挂载数据卷、挂载secret等工作,kubelet还会定期将Pod运行状态/信息上报给api-server。
- kube-proxy:service接收到请求后就需要“kube-proxy”完成流量转发至Pod,它实现的是四层负载均衡转发。
1.3 其他组件
- flannel
- coredns
- Dashboard
- Ingress Controller
二、相关概念
Kubernetes里的所有资源对象都可以采用YAML或者JSON格式的文件来定义或描述。
2.1 Pod
- Pod:调度的最小单位。
- 一个pod的所有容器都运行在同一个节点上;一个pod绝不跨越两个节点。
- 同一pod中容器之间的部分隔离:一个pod中的所有容器都在相同的network和UTS命名空间下运行,所以它们都共享相同的主机名和网络接口。
- 一个pod中的所有容器也都具有相同的loopback网络接口,因此容器可以通过localhost与同一pod中的其他容器进行通信。
2.2 deployment
- 维持pod数量。
- Deployment是Kubernetes在1.2版本中引入的新概念,用于更好地解决Pod的编排问题。
- Deployment在内部使用了Replica Set来实现目的,可以看作RC的一次升级。
- Deployment相对于RC的一个最大升级是可以随时知道当前Pod“部署”的进度。
2.3 service
- 多个pod抽象为一个服务。
-
Kubernetes的Service定义了一个服务的访问入口地址,前端的Pod通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,Service与其后端Pod副本集群之间则是通过Label Selector来实现无缝对接的。RC的作用是保证Service的服务能力和服务质量始终符合预期标准。
service - Kubernetes的服务发现机制:DNS
2.4 dns
默认dns解析,deployment名字对应虚拟的ip。
2.5 ingress
端口映射到外网。
2.6 Label
- Label可以被附加到各种资源对象上,例如Node、Pod、Service、RC等。
- 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。
- 可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
- 可以通过Label Selector查询和筛选拥有某些Label的资源对象。
2.7 Replication Controller
- RC的定义包括:
(1)Pod期待的副本数量
(2)用于筛选目标Pod的Label Selector
(3)当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模版 - 在定义了一个RC并将其提交到Kubernetes集群中后,Master上的Controller Manager组件就得到通知,定期巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于此RC的期望值,如果有过多的Pod副本在运行,系统就会停掉一些Pod,否则系统会再自动创建一些Pod。
- 通过RC,Kubernetes实现了用户应用集群的高可用性,并且大大较少了传统手工运维工作。
- 删除RC并不会影响通过该RC已创建好的Pod。为了删除所有Pod,可以设置replicas的值为0,然后更新该RC。另外,kubectl提供了stop和delete命令来一次性删除RC和RC控制的全部Pod。
2.8 Horizontal Pod Autoscaler
- Horizontal Pod Autoscaler(Pod横向自动扩容,HPA),HPA和RC、Deployment一样,也属于一种Kubernetes资源对象。
- 实现原理:通过追踪分析指定RC控制的所有目标Pod的负载变化情况,来确定是否需要有针对性地调整目标Pod的副本数量。
2.9 StatefulSet
- 在Kubernetes系统中,Pod的管理对象RC、Deployment、DaemonSet和Job都面向无状态的服务。
- StatefulSet从本质上来说,可以看作Deployment/RC的一个特殊变种,实现有状态的集群。
2.10 Job
- Job和RC、Deployment类似,也控制一组Pod容器。
- Job所控制的Pod副本是短暂运行的。
- Job所控制的Pod副本的工作模式能够多实例并行计算。
2.11 Volume
- Volume是Pod中能够被多个容器访问的共享目录。
- Kubernetes中的Volume与Pod的生命周期相同,但与容器的生命周期不相关。
- Kubernetes提供了非常丰富的Volume类型:emptyDir、hostPath、gcePersistentDisk、awsElasticBlockStore、NFS等。
2.12 Persistent Volume
- PV可以被理解成Kubernetes集群中的某个网络存储对应的一块存储。
2.13 Annotation
- Annotation(注解),是用户任意定义的附加信息,以便于外部工具查找。
- 用Annotation记录的信息有build信息、release信息、docker镜像信息等。
2.14 ConfigMap
- ConfigMap配置集中化。
三、使用kubeadm工具快速安装Kubernetes集群
3.1 安装脚本
写了份centos上安装k8s集群的脚本,可参考进行安装。
set -e
set -x
if [ "$(whoami)"=="root" ];
then
echo "install Kubernets by root";
else
echo "need root";
exit
fi
if [ -f /etc/redhat-release ];
then
cat /etc/issue
else
echo "暂时此脚本,目前仅在Centos 7中测试"
exit 0
fi
# 系统软件包管理器配置
echo "==========================================================="
echo " 1 Update PM "
echo "==========================================================="
yum install -y wget
mkdir -p /etc/yum.repos.d
if [ "$(rpm -q centos-release|cut -d- -f3)" == "7" ]; then
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
elif [ "$(rpm -q centos-release|cut -d- -f3)" == "6" ]; then
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
elif [ "$(rpm -q centos-release|cut -d- -f3)" == "5" ]; then
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
fi
yum clean all
yum makecache
yum repolist
if docker --version; then
echo " Docker Installed "
echo $(docker --version)
else
echo "==========================================================="
echo " 2 Docker-ce Installing"
echo "==========================================================="
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-18.09.8
systemctl enable docker && systemctl start docker
systemctl status docker
fi
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://twoqlji4.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker version
# 修改cgroupdriver(是为了消除安装k8s集群时的告警)"exec-opts": ["native.cgroupdriver=systemd"]
# 查看修改后状态
# docker info | grep Cgroup
echo "==========================================================="
echo " 3 PreConfig "
echo "==========================================================="
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
free -m
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
echo "==========================================================="
echo " K8s Installing "
echo "==========================================================="
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[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
yum clean all
yum -y makecache
yum list | grep kubeadm
yum install -y kubelet-1.17.5 kubeadm-1.17.5 kubectl-1.17.5
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
systemctl enable kubelet && systemctl start kubelet
echo "==========================================================="
echo " Necessary components Installing"
echo "==========================================================="
# 下载相关必要组件镜像
# images=$(kubeadm config images list 2>> /dev/null| grep "k8s.gcr.io"|awk -F "/" '{print $2}')
# for imageName in ${images[@]} ; do
# echo $imageName
# 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
# K8sImages=$(docker images|grep k8s.gcr.io|awk '{{printf"%s ",$1":"$2}}')
# docker save -o k8s.tar $K8sImages
# docker save -o k8s.tar \
# k8s.gcr.io/kube-proxy:v1.17.5 \
# k8s.gcr.io/kube-apiserver:v1.17.5 \
# k8s.gcr.io/kube-controller-manager:v1.17.5 \
# k8s.gcr.io/kube-scheduler:v1.17.5 \
# k8s.gcr.io/coredns:1.6.5 \
# k8s.gcr.io/etcd:3.4.3-0 \
# k8s.gcr.io/pause:3.1
# 加载全部镜像
docker load -i k8s-1.17.5.tar
# 以下仅master
hostnamectl set-hostname master
kubeadm init --apiserver-advertise-address=10.10.66.203 --kubernetes-version v1.17.5 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.81.0.0/16
# CNI网络插件
# weave插件安装
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
# 以下仅node
hostnamectl set-hostname node1
# 在node节点执行加入集群的指令,token和key使用上一步生产得到的值:
kubeadm join 10.10.66.203:6443 –token 424mp7.nkxx07p940mkl2nd \
--discovery-token-ca-cert-hash sha256:d88fb55cb1bd659023b11e61052b39bbfe99842b0636574a16c76df186fd5e0d
3.2 kubernetes集群的安全设置
Kubernetes提供了基于CA签名的双向数字证书认证方式和简单的基于HTTP Base或Token的认证方式。
(1)基于CA签名的双向数字证书的生成
(2)基于HTTP Base或Token的简单认证方式
3.3 Dashboard使用
- (1)dashboard安装脚本
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml
kubectl get all -n kubernetes-dashboard
# 修改service类型,将ClusterIP改为NodeIp
kubectl edit service/kubernetes-dashboard -n kubernetes-dashboard
# 查看外网访问端口
kubectl get all -n kubernetes-dashboard
- (2)Dashboard使用自定义证书
参考https://blog.csdn.net/chenleiking/article/details/81488028 - (3)获取token登录
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
四、kubectl命令行工具用法
kubectl命令行语法如下:
kubectl [command] [TYPE] [NAME] [flags]
- command:子命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等。
- TYPE:资源对象的类型,区分大小写,能以单数、复数或者简写形式表示,例如pod(pods/po)、nodes等。
- NAME:资源对象的名称,区分大小写。如果不指定名称,系统则将返回属于TYPE的全部对象的列表。
- flags:kubectl子命令的可选参数,例如使用“-s”指定API Server的URL地址。
4.1 kubectl输出格式
-o json/wide/yaml等。
其中wide是输出额外信息。
4.2 操作示例
# 创建资源对象
kubectl create -f my-service.yaml -f my-rc.yaml
# 查看资源对象
kubectl get pods,rc,service
# 描述资源对象
kubectl describe nodes/pods <name>
# 删除资源对象
kubectl delete -f pod.yaml
kubectl delete pods,services -l name=<label-name>
# 执行容器的date命令
kubectl exec <pod-name> -c <container-name> date
# 查看容器的日志
kubectl logs -f <pod-name> -c <container-name>
# 在线编辑运行中的资源对象
kubectl edit deploy nginx
网友评论