k8s逻辑架构图
Master组件介绍
etcd
etcd是一个数据库,它的目标是构建一个高可用的分布式键值数据库,它是基于GO语言实现。在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。在K8s中用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。
API Server
提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。
Controller Manager
集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。
Scheduler
集群中的调度器,负责Pod在集群节点中的调度分配。
Node组件介绍
Kubelet
负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。
Proxy
实现了Service的代理与软件模式的负载均衡器。
##########################安装配置##########################
1.etcd安装和配置
1.1.安装etcd
yum install etcd y
1.2.修改etcd.service
vi /usr/lib/systemd/system/etcd.service
#修改配置如下:
ExecStart=/bin/bash-c "GOMAXPROCS=$(nproc) /usr/bin/etcd--name=\"${ETCD_NAME}\"--data-dir=\"${ETCD_DATA_DIR}\"--listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\"--listen-
peer-urls=\"${ETCD_LISTEN_PEER_URLS}\"--advertise-client-urls=\"${ETCD_ADVERTISE_CLIENT_URLS}\"--initial-cluster-token=\"${ETCD_INITIAL_CLUSTER_TOKEN}\"--initial-cluster=\"
${ETCD_INITIAL_CLUSTER}\" --initial-cluster-state=\"${ETCD_INITIAL_CLUSTER_STATE}\""
1.3.修改etcd.conf
vi /etc/etcd/etcd.conf
#修改配置如下:
#ETCD_WAL_DIR=""
ETCD_LISTEN_PEER_URLS="http://192.169.21.128:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.169.21.128:2379,http://127.0.0.1:2379"
ETCD_NAME="default"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.169.21.128:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.169.21.128:2379"
ETCD_INITIAL_CLUSTER="default=http://192.169.21.128:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_STRICT_RECONFIG_CHECK="true"
1.4.启动etcd
systemctl start etcd
2.flannel安装和配置
2.1.安装flannel
yum install flannel y
2.2.修改flanneld配置
vi /etc/sysconfig/flanneld
#修改配置如下:
# Flanneldconfiguration options
# etcd urllocation. Point this to the server where etcdruns
FLANNEL_ETCD_ENDPOINTS="http://192.169.21.128:2379"
# etcd config key. This is the configuration key thatflannel queries
# For addressrange assignment
FLANNEL_ETCD_PREFIX="/flannel/network"
# Any additionaloptions that you want to pass
#FLANNEL_OPTIONS=""
2.3.设置flannel环境变量:
etcdctl set /flannel/network/config'{"Network":"172.17.0.0/16"}'
etcdctlset/flannel/network/subnets/172.17.10.0-24'{"PublicIP":"192.169.21.128"}'
备注:/flannel/network需要与/etc/sysconfig/flanneld中的FLANNEL_ETCD_PREFIX="/flannel/network"一致
2.4.启动flannel
#more/usr/lib/systemd/system/etcd.service
systemctl start flanneld
3.docker安装和配置
3.1.docker安装自行参考其它文档。
3.2.修改docker.service配置
vi /usr/lib/systemd/system/docker.service
#import flannelconfiguration
EnvironmentFile=-/etc/sysconfig/flanneld
EnvironmentFile=-/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd--bip=${FLANNEL_SUBNET}
3.3.启动docker
systemctl start docker
3.4.查看flannel0与docker0是否在同一网络,主要看网段是否一致
ip a
4.下载和安装k8s(V1.7.15)
4.1.下载
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.7.md#downloads-for-v1715
Server
https://dl.k8s.io/v1.7.15/kubernetes-server-linux-arm64.tar.gz
Node
https://dl.k8s.io/v1.7.15/kubernetes-node-linux-amd64.tar.gz
4.2.安装过程
cd /opt
mkdir kubernetes
mkdir -p {bin,cfg,server,node}
cd /opt/kubernetes/server
tar -zxvf kubernetes-server-linux-arm64.tar.gz
cd /opt/kubernetes/node
tar -zxvf kubernetes-node-linux-amd64.tar.gz
cd /opt/kubernetes/bin
mv/opt/kubernetes/kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl}/opt/kubernetes/bin
mv/opt/kubernetes/node/kubernetes/node/bin/{kubelet,kube-proxy}/opt/kubernetes/bin/
4.3.启动k8s master相关组件
·启动kube-apiserver
./kube-apiserver --address=0.0.0.0 --insecure-port=8080--service-cluster-ip-range='10.10.10.1/24'--log_dir=/usr/local/kubernete_test/logs/kube--kubelet_port=10250 --v=0--logtostderr=false--etcd_servers=http://192.169.21.128:2379--allow_privileged=false
·启动kube-controller-manager
./kube-controller-manager --v=0--logtostderr=false--log_dir=/usr/local/kubernete_test/logs/kube--master=192.169.21.128:8080
·启动kube-scheduler
./kube-scheduler --master='192.169.21.128:8080'--v=0 --log_dir=/usr/local/kubernete_test/logs/kube
4.4.检查master节点是否正常启动
./kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
scheduler Healthy ok
4.5.启动k8s node相关组件
·启动kube-proxy
./kube-proxy --logtostderr=false--v=0--master=http://192.169.21.128:8080
·启动kubelet
./kubelet --logtostderr=false --v=0--allow-privileged=false --log_dir=/usr/local/kubernete_test/logs/kube --address=0.0.0.0 --port=10250 --hostname_override=192.169.21.128--api_servers=http://192.169.21.128:8080
4.6.在node上设置集群Context
./kubectl config set-clustertest-cluster--server=http://192.169.21.128:8080
./kubectl config set-context test-cluster--cluster=test-cluster
./kubectl config use-context test-cluster
4.7.下载kubernetes/pause镜像
docker pull docker.io/kubernetes/pause
4.8.测试K8S是否启动成功
./kubectl get nodes
NAME STATUS AGE VERSION
192.169.21.128 Ready 21h v1.7.15
5.部署nginx集群
5.1.创建nginx Pods
./kubectl run nginx --image=nginx --port=80 --replicas=5
./kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-1423793266-5nlrd 0/1 ContainerCreating 0 22s
nginx-1423793266-h03r2 0/1 ContainerCreating 0 23s
nginx-1423793266-jmb6m 0/1 ContainerCreating 0 23s
nginx-1423793266-wj64l 0/1 ContainerCreating 0 23s
nginx-1423793266-xzqdd 0/1 ContainerCreating 0 22s
5.2.创建nginx-service.yaml
vi nginx-service.yaml
#配置文件如下:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
targetPort: 9090
selector:
name: nginx
5.3.根据Pods创建Service
./kubectl create -f ./nginx-service.yaml
./kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.10.10.1 <none> 443/TCP 22h
nginx 10.10.10.228 <none> 80/TCP 14s
到此k8s nginx集群部署完成。