Kubernetes

一、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
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容