Centos7部署Kubernetes Cluster

本人通过博客的方式,将学习k8s的笔记分享交流。如有错误,欢迎指点,感谢!



实验环境:    
    master 192.168.1.5    (controller,etcd)
    node1  192.168.1.16
    node2  192.168.1.19
    
关闭每台主机的安全策略:(仅实验环境)
    systemctl stop firewalld
    iptables -F
    setenforce 0
    
    

Master运行组件:    

1、kube-apiserver
    API Server 提供HTTP/HTTPS ,即kubernetes API。各种客户端工具以及Kubernetes其他组件可以
通过它来管理Cluster的各种资源。

2、kube-scheduler
    Scheduler 负责决定将Pod放在哪个Node上运行,主要负责调度,根据当前Cluster的结构,满足负载、
高可用、性能等需求。

3、kube-controller-manager
 
   Controller Manager 负责管理Cluster各种资源,不同的controller管理不同的资源。

4、etcd
    etcd 负责保存kubernetes cluster 的配置信息和各种资源的状态信息。当信息发生改变时,etcd会立即
通知kubernetes的各个组件。

5、Pod 网络
    Pod 要能够通信必须要部署Pod网络,flannel是其中的一种方案。


[root@k8s-master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.5  master
192.168.1.16 node1
192.168.1.19 node2


[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts
[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts


[root@k8s-master ~]# yum -y install kubernetes-master etcd

etcd概述:

    etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来
自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是
一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft
中,任何一个节点都可能成为Leader。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和
CoreOS的Fleet都广泛使用了etcd。




[root@k8s-master etcd]# cat /etc/etcd/etcd.conf
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"                 //数据库位置
#ETCD_WAL_DIR=""                                        //默认存放数据的位置/var/lib/etcd/
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"              //监听其他etcd的地址
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"   //监听etcd客户端地址
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="master"                                        //节点名称
#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://master:2380"      //通告其他etcd的地址
ETCD_ADVERTISE_CLIENT_URLS="http://master:2379,http://master:4001" //通告客户端的地址
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
ETCD_INITIAL_CLUSTER="master=http://master:2380,node1=http://node1:2380,node2=http://node2: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_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_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="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"




如果出现了request sent was ignored (cluster ID mismatch:)报错,解决方法如下:
    将etcd的数据目录删除,然后在重启etcd                   [/var/lib/etcd/default.etcd/]

    



etcd节点配置:    
[root@k8s-node1 ~]# yum -y install kubernetes-node etcd flannel docker
[root@k8s-node1 ~]# cat /etc/etcd/etcd.conf | grep -v "^#"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="node1"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.16:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://node1:2379,http://node1:4001"
ETCD_INITIAL_CLUSTER="master=http://master:2380,node1=http://node1:2380,node2=http://node2:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"





查看集群状态:
[root@k8s-node1 etcd]# etcdctl cluster-health
member 43bb846a7344a01f is healthy: got healthy result from http://node2:2379
member 70192b54fb86c1a5 is healthy: got healthy result from http://master:2379
member a9aee06e6a14d468 is healthy: got healthy result from http://node1:2379
cluster is healthy

图片.png





kubernetes控制端配置:

[root@k8s-master ~]# cat /etc/kubernetes/apiserver | grep -v "^#"
#在本地服务器上的地址进行侦听。
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
#在本地服务器上的端口侦听。
KUBE_API_PORT="--port=8080"
#端口管理员侦听
KUBELET_PORT="--kubelet-port=10250"
#ETCD集群中节点的逗号分隔列表
KUBE_ETCD_SERVERS="--etcd-servers=http://master:2379,http://=node1:2379,http://=node2:2379"
#集群地址范围
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#默认接纳控制策略
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
#加上你自己的参数,默认为空
KUBE_API_ARGS=""


[root@k8s-master ~]# systemctl start kube-apiserver
[root@k8s-master ~]# systemctl start kube-controller-manager
[root@k8s-master ~]# systemctl start kube-scheduler




kubernetes节点配置:

[root@k8s-node1 ~]# cat /etc/kubernetes/config | egrep -v "^#|$^"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://master:8080"    



kubelet配置:
[root@k8s-node1 ~]# cat /etc/kubernetes/kubelet | egrep -v "^#|$^"
KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=192.168.1.16"
KUBELET_API_SERVER="--api-servers=http://master:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""



网络配置:
[root@k8s-node1 ~]# cat /etc/sysconfig/flanneld | egrep -v "^#|$^"
FLANNEL_ETCD_ENDPOINTS="http://master:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"


开启kubelet服务:
[root@k8s-node1 ~]# systemctl start kubelet


查看集群状态:
[root@k8s-master ~]# kubectl get nodes
NAME           STATUS    AGE
192.168.1.16   Ready     14h
192.168.1.19   Ready     14h
图片.png




集群的使用:

我已经在我节点上下载好docker镜像,关于docker部分可以参考我之前的文章。

图片.png



docker 和k8s的关系:

    docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。

    k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

简单的来说,就是用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持其他的容器技术。



如果不指定namespace会默认的在default中创建

[root@k8s-master ~]# kubectl run 01nginx --image=docker.io/nginx  --replicas=2 --port=80
deployment "nginx" created


[root@k8s-master ~]# kubectl get pods
NAME                       READY     STATUS             RESTARTS   AGE
01nginx-2977218101-509gt   1/1       Running            0          15h
01nginx-2977218101-x8057   1/1       Running            0          15h

图片.png



[root@k8s-master ~]# kubectl get pod  -o wide
nginx-2081865075-h175t     1/1       Running            0          16h       172.17.0.4   192.168.1.19
nginx-2081865075-rhspz     1/1       Running            0          16h       172.17.0.3   192.168.1.19











猜你喜欢

转载自blog.51cto.com/13735335/2298080