Kubernetes安装搭建一(软件包管理工具)


Kubernetes安装

  • 通过软件包管理工具安装K8s : 主要介绍如何通过CentOS的yum软件包管理工具安装K8s
  • 通过二进制文件安装K8s:介绍如何通过K8s官方提供的二进制文件进行K8s的安装部署。
  • 通过源码安装K8s:介绍如何获取K8s源代码,以及如何进行编译和安装部署。

提示:以下是本篇文章正文内容。

一、通过软件包管理工具安装

对于初学者而言,通过这种方式可以快速搭建K8s的运行环境。本文以CentOS为例。

1.软件包管理工具

目前Linux系统下常见的软件包格式主要有RPM包、TAR包、bz2包、gz包以及dev包等。其中RPM最为常见,它是Linux的软件包管理标准,TAR包是一种文件归档形式,bz2和gz都是比较常见的压缩包工具。dev则是Debian制定的软件包管理形式。

CentOS中,用户可以通过yum命令或者rpm命令来安装软件包,yum命令最为常用的两个选项是-skip-broken(在安装时忽略依赖检查,尽量避免使用),另一个是 -y ,yum采用交互式安装软件包,用此选项后,默认一律选择yes。常用命令还有erase、install、search等,erase用来删除包,install安装指定包,search搜索指定的包,后面都是接包名。

2.节点规划

本例中,部署3台机器,1台为master节点,另外2台为node节点。

Master节点安装kubernetes-master和etcd软件包。
Node节点安装kubernetes-node、etcd、flannel和docker软件包。flannel为网络组件,docker为运行容器。
2个Node节点都安装etcd,这样3个节点组成etcd集群。

kubernetes=master包括kube-apiserver、kube-controller-manager和kube-scheduler等组件及其管理工具。
kubernetes-node包括kubelet及其管理工具。

3. 安装前准备

  1. 禁用SELinux
    虽然SELinux这种强制访问控制系统在很大程度上可以加强Linux的安全性,但是也影响k8s某些组件功能。
    临时禁用,重启失效
setenforce 0

彻底禁用

vim /etc/selinux/config
# 修改
SELINUX=disabled
  1. 禁用firewalld
    firewalld是CentOS 7开始采用的防火墙系统,代替iptables,它会影响Docker的网络功能。
systemctl stop firewalld
systemctl disable firewalld
  1. 更新软件包
yum -y update

4.同步系统时间
通过NTP同步3台机器时间,cn.pool.ntp.org是中国的网络时间协议(NTP)服务器

ntpdate -u cn.pool.ntp.org

4.etcd集群配置

etcd是一个高可用的分布式键值数据库。K8s利用etcd来存储数据。

在master节点上,

yum -y install kubernetes-master etcd

然后修改etcd配置文件/etc/etcd/etcd.conf,内容如下:

#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
ETCD_LISTEN_PEER_URLS="http://192.168.1.121:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.121:2379,http://127.0.0.1:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="etcd1"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.121:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.121:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.1.121:2380,http://192.168.1.122:2380,http://192.168.1.123:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"

上面配置文件中,主要修改的选项如下:

  • ETCD_LISTEN_PEER_URLS
    用来指定etcd节点监听的URL,用于与其他分布式etcd节点通信,实现整个etcd节点的数据通信、交互、选举以及数据同步等。可以使http://ip:port或者https://ip:port。本例中,节点IP地址为192.168.1.121 默认端口2380

  • ETCD_LISTEN_CLIENT_URLS
    指定对外提供服务的地址,etcd API的地址,etcd客户端通过该URL访问etcd服务器。默认端口2379

  • ETCD_NAME
    指定etcd节点的名称。

  • ETCD_INITIAL_ADVERTISE_PEER_URLS
    指定节点同伴监听地址,用来在集群中传递数据。

  • ETCD_ADVERTISE_CLIENT_URLS
    指定当前etcd节点对外公告的客户端监听地址,这个值会告诉集群中其他节点。

  • ETCD_INITIAL_CLUSTER
    该选项列出当前etcd集群中所有的etcd节点的节点通信地址。

在Node节点上,安装k8s节点组件、etcd、flannel以及docker

yum -y install kubernetes-node flannel docker

安装完成后,修改/etc/etcd/etcd.conf配置,内容如下:

#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
ETCD_LISTEN_PEER_URLS="http://192.168.1.122:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.178.1.122:2379,http://127.0.0.1:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="etcd2"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.122:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.122:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.1.121:2380,http://192.168.1.122:2380,http://192.168.1.123:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIR="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[Security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="DEFAULT"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="false"
#
#[Profile]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"

在节点2上面执行同样的命令,安装相同的组件,只不过/etc/etcd/etcd.conf文件中的内容与节点Node 1稍微有些不同

#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
ETCD_LISTEN_PEER_URLS="http://192.168.1.123:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.178.1.123:2379,http://127.0.0.1:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="etcd3"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.123:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.123:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="etcd1=http://192.168.1.121:2380,http://192.168.1.122:2380,http://192.168.1.123:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"
#ETCD_ENABLE_V2="true"
...

配置完成后,在3个节点上分别执行以下命令,以启用和启动etcd服务:

systemctl enable etcd
systemctl start etcd
#查看状态
systemctl status etcd

如果上面的输出中圆点为绿色,并且active的值为active (running),就标识服务启动成功。

etcd 提供的etcdctl命令可以查看etcd集群的健康状态:

etcdctl cluster-health

5.Master节点配置

Master节点主要运行apiserver、controller-manager以及scheduler等主要的服务进程。以上服务的配置文件都在/etc/kubernetes目录中。通常要配置api-server,配置文件为/etc/kubernetes/apiserver:

###
# The address on the local server to listen to 
#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
KUBE_API_ADDRESS="--address=0.0.0.0

# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"
# port minions listen on
KUBELET_PORT="--kubelet-port=10250"
# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.121:2379,http://192.168.1.122:2379,http://192.168.1.123:2379"
#Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
#add your own !
KUBE_API_ARGS=""

KUBE_API_ADDRESS 表示api-server进程绑定的IP地址,在本例中将其修改为–address=0.0.0.0,表示绑定本机所有的IP地址。
KUBE_API_PORT指定api-server监听的端口。
KUBELET_PORT表示kubelet监听的服务端口。
KUBE_ETCD_SERVERS选项指定etcd集群中的每个节点的地址。
KUBE_SERVICE_ADDRESSES指定k8s中服务IP地址范围。
KUBE_ADMISSION_CONTRO 默认会包含SecurityContextDeny和ServiceAccount ,测试时可以去掉。

配置完成后,启动Master节点上各项服务:

systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start 

然后通过systemctl status 来查看服务是否启动成功。
为了各项服务在Linux系统启动时自启动,使用:

systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler

k8s 的api-server提供的各个接口是RESTful的,用户可以通过浏览器访问Master节点的8080端口,api-server会以JSON对象的形式返回各个API的地址。

6. Node节点的配置

Node节点主要运行Kube-proxy和kubelet进程,用户主要修改配置文件/etc/kubernets/config、/etc/kubernetes/proxy以及/etc/kubernetes/kubelet,分别为 k8s的全局配置文件、kube-proxy配置文件以及kubelet配置文件。区别主要在节点的IP地址。

Node1:
首先修改/etc/kubernetes/config,主要修改KUBE_MASTER,指定apiserver地址:

###
# kubernetes system config
#
# The following values are used to configure various aspects of all k8s services,including 
#
# kube-apiserver.service
# kube-controller-manager.service
# kube-scheduler.service
# kubelet.service
# kube-proxy.service
# logging to stderr means we get it in systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

#Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.1.121:8080"

然后修改kubelet的配置文件,内容:

###
# kubernetes kubelet (minion) config

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=127.0.0.1"

# The port for the info server to serve on 
KUBELET_PORT="--port=10250"

#You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=192.168.1.122"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.1.121:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

#Add your own!
KUBELET_ARGS=""

其中KUBELET_ADDRESS指定kubelet绑定的IP地址,如果想绑定本机所有的网络接口,可以指定为0.0.0.0。
KUBELET_PORT指定kubelet监听的端口。
KUBELET_HOSTNAME指定本节点的主机名/IP地址。
本例中,NODE 1节点IP地址为192.168.1.122。
KUBELET_API_SERVER指定api-server地址。

PS: 如果KUBELET_HOSTNAME值为主机名,就需要在hosts文件中配置主机名和IP的对应关系

最后,修改/etc/kubernetes/proxy,

###
# kubernetes proxy config
# default config should be adequate
# Add your own!
KUBE_PROXY_ARGS="-bind-address=0.0.0.0"

配置完成后,执行命令启动配置:

systemctl enable kube-proxy
systemctl enable kubelet

然后启动kube-proxy和kubelet服务:

systemctl start kube-proxy
systemctl start kubelet

按照上面的方法在Node 2节点完成配置。注意把相应的IP地址改为Node 2的IP 192.168.1.123,配置完成后启动服务。

最后测试集群是否正常,在Master节点:

kubectl get nodes

如果上面命令输出各个节点并且状态为Ready,即表示当前集群已经正常工作。

7.配置网络

Flannel是K8s中常用的网络配置工具,用于配置第三层(网络层)网络结构。Flannel直接使用k8s API或etcd存储网络配置、分配的子网及任何辅助数据。

配置Flannel之前,先要预先设置分配给Docker网络的网段。在Master节点,在etcd中添加一个名称为/atomic.io/network/config的主键,通过该主键提供给Docker容器使用的网段及子网。

etcdctl mk /atomic.io/network/config

然后在Node 1和Node 2这2个Node节点上修改/etc/sysconfig/flanneld 配置文件:

# Flanneld configuration options
#
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://192.168.1.121:2379,http://192.168.1.122:2379,http://192.168.1.123:2379"

# etcd config key. This is the configuration key that flannel queries 
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"
# Any additional options that you want to pass
FLANNEL_OPTIONS="--iface=ens33"

其中,FLANNEL_ETCD_ENDPOINTS 用来指定etcd集群的各个节点的地址。
FLANNEL_ETCD_PREFIX指定etcd 中网络配置的主键。
FLANNEL_OPTIONS中的–iface选项用来指定Flannel网络使用的网络接口。

Node 1和Node 2启动Flanneld:

systemctl enable flanneld
systemctl start flanneld

启动后,通过ip命令查看系统网络接口,会多出一个flannel0的网络接口:

ip address show | grep flannel

flannel 还生成了2个配置文件,分别是/run/flannel/subnet.env和/run/flannel/docker。其中subnet.env的内容为:

cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.17.0.0/16
FLANNEL_SUBNET=172.17.93.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false

docker内容如下:

cat /run/flannel/docker
DOCKER_OPT_BIP="--bip=172.17.93.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1472"
DOCKER_NETWORK_OPTIONS="--bip=172.17.93.1/24 --ip-masq=true --mtu=1472"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值