k8s 核心架构:https://www.kubernetes.org.cn/4291.htmlhtml
k8s 高可用2个核心 apiserver master 和 etcdnode
etcd:(需高可用)集群的数据中心,用于存放集群的配置以及状态信息,很是重要,若是数据丢失那么集群将没法恢复;所以高可用集群部署首先就是etcd是高可用集群;linux
Apiserver:提供了资源操做的惟一入口,并提供认证、受权、访问控制、API注册和发现等机制。整个集群中其余角色只有经过Apiserver才能访问etcd。CLI工具kubectl也是经过apiserver来对总体集群进行访问控制。git
Controller-manager:负责维护集群的状态,好比故障检测、自动扩展、滚动更新等。一组k8s master上同一时间只有一个controller-manager角色进行工做,由于要避免控制冲突。github
Scheduler:负责资源的调度,按照预约的调度策略将Pod调度到相应的机器上。一组k8s master上同一时间只有一个scheduler角色进行工做,一样由于要避免控制冲突。docker
Kubelet:负责pod对应的容器的建立、启停等任务,同时也负责Volume(CVI)和网络(CNI)的管理。数据库
kube-proxy: 每一个node上一个,负责service vip到endpoint pod的流量转发和负载均衡,老版本主要经过设置iptables规则实现,新版1.9基于kube-proxy-lvs 实现vim
访问部署在kubernetes集群中服务,有两种类型:api
集群内部实现访问安全
集群外部实现访问
可是不论是集群内部仍是外部访问都是要通过kube-proxy的
环境初始化
1.安装以前关闭全部节点的防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
[root@test ~]# getenforce
Disabled
master | 172.20.103.1 |
node |
172.20.103.2 |
node |
172.20.103.3 |
master上部署的服务:etcd、kube-apiserver、kube-controller-manager、kube-scheduler
etcd服务:见笔记(etcd高可用集群)
etcd服务做为k8s集群的主数据库,在安装k8s各服务以前须要首先安装和启动
Master安装:
下载最新的二进制版本kubernetes-server-linux-amd64.tar.gz并解压缩,而后在解压缩文件中,找到./kubernetes/server/bin包含全部必需的二进制文件的文件。
若是用https协议下载报错,能够用http方式链接,使用“--no-check-certificate”
wget https://storage.googleapis.com/kubernetes-release/release/v1.14.2/kubernetes-server-linux-amd64.tar.gz
tar -zxf kubernetes-server-linux-amd64.tar.gz
cd /opt/kubernetes/server/bin
cp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/bin/
建立master端主配置文件:
建立存放配置文件的目录
mkdir -p /etc/kubernetes
mkdir -p /etc/kubernetes/logs
kube-apiserver 服务
建立kube-apiserver的systemd配置文件:vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=etcd.service
Wants=etcd.service
[Service]
EnvironmentFile=-/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/apiserver的内容包括了kube-apiserver的所有启动参数,主要的配置参数在变量KUBE_API_ARGS中指定。
vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=169.169.0.0/16 --service-node-port-range=1-65535 --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
启动参数说明以下:
--storage-backend:指定etcd的版本,从k8s1.6开始,默认为etcd3。在1.6以前的版本中没有这个参数,kube-apiserver默认使用etcd2。
--etcd-servers:指定etcd服务的URL
--insecure-bind-address:api server绑定主机的非安全IP地址,设置0.0.0.0表示绑定全部IP地址
--insecure-port:api server绑定主机的非安全端口号,默认为8080
--service-cluster-ip-range:k8s集群中service的虚拟IP地址范围,该IP范围不能与物理机的IP地址有重合。以CIDR格式表示,例如169.169.0.0/16 。
--service-node-port-range:k8s集群中service可以使用的物理机端口号范围,默认值30000~32767。
--enable-admission-plugins:k8s集群的准入控制设置,各控制模块以插件的形式依次生效。
--logtostderr:设置为false表示将日志写入文件,不写入stderr。
--log-dir:日志目录
--v:日志级别
kube-controller-manager 服务
kube-controller-manager服务依赖于kube-apiserver服务
建立kube-controller-manager的systemd配置文件:vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/controller-manager的内容包含了kube-controller-manager的所有启动参数,主要的配置参数在变量KUBE_CONTROLLER_MANAGER_ARGS中指定:
vim /etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
启动参数说明以下:
--kubeconfig:设置与api server 链接的相关配置,vim /etc/kubernetes/kubeconfig
apiVersion: v1
kind: Config
users:
- name: client
clusters:
- name: default
cluster:
server: http://api_server_ip:8080
contexts:
- context:
cluster: default
user: client
name: default
current-context: default
--logtostderr:设置为false表示将日志写入文件,不写入stderr。
--log-dir:日志目录
--v:日志级别
kube-scheduler 服务
kube-scheduler 服务也依赖于kube-apiserver服务
建立kube-scheduler的systemd配置文件:vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler Plugin
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Requires=kube-apiserver.service
[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/scheduler 的内容包含了kube-scheduler 的所有启动参数,主要的配置参数在变量KUBE_SCHEDULER_ARGS 中指定:
vim /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
启动参数说明以下:
--kubeconfig:设置与api server 链接的相关配置,能够与kube-controller-manager使用的kubeconfig 文件相同。
--logtostderr:设置为false表示将日志写入文件,不写入stderr。
--log-dir:日志目录
--v:日志级别
启动服务
搭建完成以后先启动etcd而后在启动其余服务,执行systemctl start 命令按顺序启动这3个服务,同时使用systemctl enable命令将服务加入开机启动列表中。
systemctl daemon-reload
systemctl enable kube-apiserver kube-controller-manager kube-scheduler
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
查看服务启动状态
systemctl status kube-apiserver kube-controller-manager kube-scheduler
至此,kubernetes master上所需的服务就所有启动完成了。
若是搭建集群,咱们在三台master主机上重复以上搭建步骤,注意配置文件中须要修改IP地址的地方,以及须要先启动etcd,而后依次启动kube-apiserver,kube-controller-manager,kube-scheduler。
验证master上组件健康:kubectl get cs
[root@test ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
Node上部署的服务:kubelet、kube-proxy、flannel(网络组建)
在node上须要预先安装好docker,先别启动,等配置好fannel以后再启动。
yum -y install docker
yum -y install flannel
编辑配置文件 vim /etc/sysconfig/flanneld 设置etcd的url地址
FLANNEL_ETCD_ENDPOINTS="http://172.20.103.1:2379" #flannel从etcd中读取配置
FLANNEL_ETCD_PREFIX="/coreos.com/network" #/coreos.com/network 是master端etcd网络受权的文件,这个须要在启动flanneld以前在master端手动生成
在启动flanneld 服务以前,须要在master端etcd中添加一条网络配置记录,这个配置将用于flanneld分配给每一个docker的虚拟ip地址段。
etcdctl set /coreos.com/network/config '{"Network":"10.10.0.0/16"}'
查看是否添加成功
etcdctl get /coreos.com/network/config
因为flannel将覆盖docker0网桥,因此若是docker服务已经启动,则须要先中止docker服务。
systemctl enable flanneld
systemctl start flanneld
systemctl enable docker
咱们能够在etcd中查看flannel设置的地址与物理机IP地址的对应规则:
etcdctl ls /coreos.com/network/subnets
etcdctl get /coreos.com/network/subnets/10.10.92.0-24
tar -zxf kubernetes-server-linux-amd64.tar.gz
cd /opt/kubernetes/server/bin
cp kubelet kube-proxy /usr/bin/
建立Node端主配置文件
建立存放配置文件的目录
mkdir -p /etc/kubernetes
mkdir -p /etc/kubernetes/logs
kubelet服务
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,好比建立容器、 Pod挂载数据卷、下载secret、获取容器和节点状态等工做。 kubelet将每一个Pod转换成一组容器。
kube-proxy在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工做。
kubelet服务依赖于docker 服务
建立kubelet的systemd 服务配置文件 vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=multi-user.target
其中,WorkingDirectory 表示kubelet保存数据的目录,须要在启动kubelet 服务以前建立。
mkdir -p /var/lib/kubelet
配置文件/etc/kubernetes/kubelet 的内容包含了kubelet 的所有启动参数,主要的配置参数在变量KUBELET_ARGS 中指定:
vim /etc/kubernetes/kubelet
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --fail-swap-on=false --cgroup-driver=systemd --hostname-override=172.20.103.2 --logtostderr=false --log-dir=/etc/kubernetes/logs --v=0"
启动参数说明以下:
--kubeconfig:设置与api server 链接的相关配置,能够与kube-controller-manager使用的kubeconfig 文件相同。
--fail-swap-on=false:设置为true表示若是主机启用了swap,kubelet组件将没法启动,默认值为true。Kubernetes v1.8+ 要求关闭系统 Swap,若不关闭则须要修改kubelet设定参数。
--cgroup-driver=systemd:用于操做本机cgroup的驱动模式,支持groupfs或者systemd,默认值为cgroupfs。docker使用的文件驱动默认systemd, 两边不一致会致使kubelet组件没法启动。
vim /etc/kubernetes/kubeconfig
apiVersion: v1
kind: Config
users:
- name: client
clusters:
- name: default
cluster:
server: http://api_server_ip:8080
contexts:
- context:
cluster: default
user: client
name: default
current-context: default
--hostname-override:设置本node的名称
--logtostderr:设置为false表示将日志写入文件,不写入stderr。
--log-dir:日志目录
--v:日志级别
kube-proxy 服务
kube-proxy 服务依赖于network 服务
建立kube-proxy的systemd配置文件 vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
Requires=network.service
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置文件/etc/kubernetes/proxy内容包括了kube-proxy的所有启动参数,主要的配置参数在变量 KUBE_PROXY_ARGS 中指定。
vim /etc/kubernetes/proxy
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --logtostderr=false --log-dir=/etc/kubernetes/logs --v=2"
启动参数说明以下:
--kubeconfig:设置与api server 链接的相关配置,能够与kube-controller-manager使用的kubeconfig 文件相同。
--logtostderr:设置为false表示将日志写入文件,不写入stderr。
--log-dir:日志目录
--v:日志级别
配置完成后,启动服务
systemctl daemon-reload
systemctl enable kubelet kube-proxy
systemctl start kubelet kube-proxy
systemctl status kubelet kube-proxy
kubelet 默认采用向master自动注册本node的机制,在master上查看各node的状态,状态为ready表示node已经成功注册而且状态为可用:
kubectl get nodes