云计算时代,Linux架构师必须掌握的K8S企业实战!

发布时间 2023-03-22 21:16:12作者: 张Sir6

喜欢Linux就点关注吧!

Kubernetes入门及概念介绍

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,可以将Docker看成Kubernetes内部使用的低级别组件。 Kubernetes不仅支持Docker,还支持Rocket,这是另一种容器技术。使用Kubernetes可以实现如下功能:

自动化容器的部署和复制;

随时扩展或收缩容器规模;

将容器组织成组,并且提供容器间的负载均衡;

很容易地升级应用程序容器的新版本;

提供容器弹性,如果容器失效就替换它等。

Kubernetes平台组件概念

Kubernetes集群中主要存在两种类型的节点:master、minion节点,Minion节点为运行 Docker容器的节点,负责和节点上运行的 Docker 进行交互,并且提供了代理功能。

Kubelect Master:Master节点负责对外提供一系列管理集群的API接口,并且通过和 Minion 节点交互来实现对集群的操作管理。

Apiserver:用户和 kubernetes 集群交互的入口,封装了核心对象的增删改查操作,提供了 RESTFul 风格的 API 接口,通过etcd来实现持久化并维护对象的一致性。

Scheduler:负责集群资源的调度和管理,例如当有 pod 异常退出需要重新分配机器时,scheduler 通过一定的调度算法从而找到最合适的节点。

Controller-manager:主要是用于保证 replication Controller 定义的复制数量和实际运行的 pod 数量一致,另外还保证了从 service 到 pod 的映射关系总是最新的。

Kubelet:运行在 minion节点,负责和节点上的Docker交互,例如启停容器,监控运行状态等。

Proxy:运行在 minion 节点,负责为 pod 提供代理功能,会定期从 etcd 获取 service 信息,并根据 service 信息通过修改 iptables 来实现流量转发(最初的版本是直接通过程序提供转发功能,效率较低。),将流量转发到要访问的 pod 所在的节点上去。

Etcd:etcd 是一个分布式一致性k-v存储系统数据库,可用于服务注册发现与共享配置储数据库,用来存储kubernetes的信息的,etcd组件作为一个高可用、强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,etcd的诞生就是为解决该问题。

Flannel:Flannel是CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,Flannel 目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。

 

 

Kubernetes单节点平台配置实战

部署Kubernetes云计算平台,至少准备两台服务器,此处为4台,包括一台Docker仓库;

 

Kubernetes Master节点:192.168.1.18

Kubernetes Node1节点:192.168.1.19

每台服务器主机上都运行如下命令:

systemctl stop firewalld

systemctl disable firewalld

yum -y install ntp

ntpdate pool.ntp.org

systemctl start ntpd

systemctl enable ntpd

 

 

Kubernetes Master安装与配置

Kubernetes Master节点上安装etcd和Kubernetes、Flannel网络,指令如下:

yum install kubernetes-master etcd flannel -y

Master /etc/etcd/etcd.conf配置文件,代码如下:

cat>/etc/etcd/etcd.conf<<EOF

# [member]

ETCD_NAME=etcd1

ETCD_DATA_DIR=”/data/etcd”

#ETCD_WAL_DIR=””

#ETCD_SNAPSHOT_COUNT=”10000″

#ETCD_HEARTBEAT_INTERVAL=”100″

#ETCD_ELECTION_TIMEOUT=”1000″

ETCD_LISTEN_PEER_URLS=”http://192.168.1.18:2380″

ETCD_LISTEN_CLIENT_URLS=”http://192.168.1.19:2379,http://127.0.0.1:2379″

ETCD_MAX_SNAPSHOTS=”5″

#ETCD_MAX_WALS=”5″

#ETCD_CORS=””

#

#[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS=”http://192.168.1.18:2380″

# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. “test=http://…”

ETCD_INITIAL_CLUSTER=”etcd1=http://192.168.1.18:2380″

#ETCD_INITIAL_CLUSTER_STATE=”new”

#ETCD_INITIAL_CLUSTER_TOKEN=”etcd-cluster”

ETCD_ADVERTISE_CLIENT_URLS=”http://192.168.1.18:2379″

#ETCD_DISCOVERY=””

#ETCD_DISCOVERY_SRV=””

#ETCD_DISCOVERY_FALLBACK=”proxy”

#ETCD_DISCOVERY_PROXY=””

#

#[proxy]

#ETCD_PROXY=”off”

#ETCD_PROXY_FAILURE_WAIT=”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_PEER_CERT_FILE=””

#ETCD_PEER_KEY_FILE=””

#ETCD_PEER_CLIENT_CERT_AUTH=”false”

#ETCD_PEER_TRUSTED_CA_FILE=””

#

#[logging]

#ETCD_DEBUG=”false”

# examples for -log-package-levels etcdserver=WARNING,security=DEBUG

#ETCD_LOG_PACKAGE_LEVELS=””

EOF

mkdir -p /data/etcd/;chmod 757 -R /data/etcd/

systemctl restart etcd.service

 

启动etcd服务,执行命令:systemctl restart etcd.service

 

Master K8S /etc/kubernetes/config配置文件,代码如下:

cat>/etc/kubernetes/config<<EOF

# kubernetes system config

# The following values are used to configure various aspects of all

# kubernetes i, including

# kube-apiserver.service

# kube-controller-manager.service

# kube-scheduler.service

# kubelet.service

# kube-proxy.service

# logging to stderr means we get it in the 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.18:8080″

EOF

 

将Kubernetes的apiserver进程的服务地址告诉Kubernetes的controller-manager, scheduler,proxy进程。

Master /etc/kubernetes/apiserver配置文件,代码如下:

cat>/etc/kubernetes/apiserver<<EOF

# kubernetes system config

# The following values are used to configure the kube-apiserver

# The address on the local server to listen to.

KUBE_API_ADDRESS=”–insecure-bind-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.18:2379″

# Address range to use for i

KUBE_SERVICE_ADDRESSES=”–service-cluster-ip-range=10.254.0.0/16″

# default admission control policies

#KUBE_ADMISSION_CONTROL=”–admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota”

KUBE_ADMISSION_CONTROL=”–admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota”

# Add your own!

KUBE_API_ARGS=””

EOF

for I in etcd kube-apiserver kube-controller-manager kube-scheduler; do

systemctl restart $I

systemctl enable $I

done

 

启动Kubernetes Master节点上的etcd, apiserver, controller-manager和scheduler进程及状态:

for I in etcd kube-apiserver kube-controller-manager kube-scheduler; do

systemctl restart $I

systemctl enable $I

systemctl status $I

done