二进制安装k8s v1.14.2版本
k8s 核心架构:https://www.kubernetes.org.cn/4291.htmlk8s 高可用2个核心 apiserver master 和 etcdetcd:(需高可用)集群的数据中心,用于存放集群的配置以及状态信息,非常重要,如果数据丢失那么集群将无法恢复;因此高可用集群部署首先就是etcd是高可用集群;Apiserver:提供了资源操作的唯一入口,并提供...
k8s 核心架构:https://www.kubernetes.org.cn/4291.html
k8s 高可用2个核心 apiserver master 和 etcd
etcd:(需高可用)集群的数据中心,用于存放集群的配置以及状态信息,非常重要,如果数据丢失那么集群将无法恢复;因此高可用集群部署首先就是etcd是高可用集群;
Apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。整个集群中其他角色只有通过Apiserver才能访问etcd。CLI工具kubectl也是通过apiserver来对整体集群进行访问控制。
Controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。一组k8s master上同一时间只有一个controller-manager角色进行工作,因为要避免控制冲突。
Scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。一组k8s master上同一时间只有一个scheduler角色进行工作,同样因为要避免控制冲突。
Kubelet:负责pod对应的容器的创建、启停等任务,同时也负责Volume(CVI)和网络(CNI)的管理。
kube-proxy: 每个node上一个,负责service vip到endpoint pod的流量转发和负载均衡,老版本主要通过设置iptables规则实现,新版1.9基于kube-proxy-lvs 实现
访问部署在kubernetes集群中服务,有两种类型:
集群内部实现访问
集群外部实现访问
但是不管是集群内部还是外部访问都是要经过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
更多推荐
所有评论(0)