废话不多说,一把梭!开干!
实验环境:
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 root@192.168.1.16:/etc/hosts
[root@k8s-master ~]# scp /etc/hosts root@192.168.1.19:/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
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
集群的使用:
我已经在我节点上下载好docker镜像,关于docker部分可以参考我之前的文章。
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
[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
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com