一、k8s简介
1.简介
- 官方中文文档:https://www.kubernetes.org.cn/docs
- Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
- Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。
2.Kubernetes组成
- Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。每个节点上都要运行Docker。Docker来负责所有具体的映像下载和容器运行。
- Kubernetes主要由以下几个核心组件组成:
- etcd:保存了整个集群的状态;
- apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡;
除了核心组件,还有一些推荐的Add-ons: - kube-dns:负责为整个集群提供DNS服务
- Ingress Controller:为服务提供外网入口
- Heapster:提供资源监控
- Dashboard:提供GUI
- Federation:提供跨可用区的集群
- Fluentd-elasticsearch:提供集群日志采集、存储与查询
二、Kubernetes集群搭建
- 实验环境:
主机 | 节点属性 | ip |
---|---|---|
server1 | k8s-master | 172.25.66.1 |
server2 | k8s-node1 | 172.25.66.2 |
-
此实验需要联网
-
清理之前的环境(由于我们之前做过swarm集群的搭建,如果没有的话跳过即可
[root@server2 ~]# docker swarm leave Node left the swarm. [root@server3 ~]# docker swarm leave Node left the swarm. [root@server1 ~]# docker swarm leave --force [root@server1 ~]# docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] y [root@server2 ~]# docker container prune [root@server3 ~]# docker container prune
1.安装相应的软件
[root@server1 mnt]# ls
cri-tools-1.12.0-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm
kubeadm-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm
kubectl-1.12.2-0.x86_64.rpm
[root@server1 mnt]# yum install -y *
[root@server2 mnt]# ls
cri-tools-1.12.0-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm
kubeadm-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm
kubectl-1.12.2-0.x86_64.rpm
[root@server2 mnt]# yum install -y *
2.关闭系统的交换分区
[root@server1 ~]# swapoff -a
[root@server1 ~]# vim /etc/fstab
[root@server1 ~]# tail -n 1 /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
[root@server1 ~]# systemctl enable kubelet.service
[root@server1 mnt]# systemctl start kubelet.service
[root@server2 ~]# swapoff -a
[root@server2 ~]# vim /etc/fstab
[root@server2 ~]# tail -n 1 /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
[root@server2 ~]# systemctl enable kubelet.service
[root@server2 ~]# systemctl start kubelet.service
查看kubelet的状态,我们会发现他是失败的,但是我们依旧需要启动他
3.查看kubeadm会用到的镜像
4.导入需要的镜像
[root@server1 images]# docker load -i kube-apiserver.tar
[root@server1 images]# docker load -i kube-controller-manager.tar
[root@server1 images]# docker load -i kube-proxy.tar
[root@server1 images]# docker load -i pause.tar
[root@server1 images]# docker load -i etcd.tar
[root@server1 images]# docker load -i coredns.tar
[root@server1 images]# docker load -i kube-scheduler.tar
[root@server1 images]# docker load -i flannel.tar
server2上相同
5.在server1上初始化
[root@server1 mnt]# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.25.66.1
[root@docker1 mnt]# vim kube-flannel.yml
76 "Network": "10.244.0.0/16"
这样则表示初始化成功,黑框的一定要记住,那是别的节点加入的命令
值的注意的是:如果第一次初始化集群失败,需要执行命令"kubeadm reset"进行重置,重置之后再执行初始化集群的命令,进行集群初始化。
6、在server1(master节点)上:根据上一步结果(初始化集群的结果)的提示信息进行操作
[root@server1 mnt]# useradd k8s 添加一个普通用户,用户名随意给。我这里指定的是k8s用户
[root@server1 mnt]# vim /etc/sudoers 编辑/etc/sudoers文件,给k8s用户赋予所有的权限。按wq!保存退出(或者编辑visudo文件,按wq保存退出)
92 k8s ALL=(ALL) NOPASSWD: ALL
[root@server1 mnt]# su - k8s
[k8s@server1 ~]$ mkdir -p $HOME/.kube
[k8s@server1 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[k8s@server1 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
7、在server1(master节点)上:解决kubectl命令不补全的问题
[k8s@server1 ~]$ echo "source <(kubectl completion bash)" >> ./.bashrc
[k8s@server1 ~]$ logout
[root@server1 mnt]# su - k8s
Last login: Thu Jun 13 05:33:21 CST 2019 on pts/0
#此时会发现kubectl命令能补全了
8、在server1(master节点)上:将kube-flannel.yml文件发送到/home/k8s目录下。因为kube-flannel.yml文件原来的/root/k8s目录下,普通用户k8s无法访问。并根据初始化集群的提示,继续操作
[k8s@server1 ~]$ logout
[root@server1 mnt]# cp kube-flannel.yml /home/k8s/
[root@server1 mnt]# su - k8s
Last login: Thu Jun 13 05:35:24 CST 2019 on pts/0
[k8s@server1 ~]$ kubectl apply -f kube-flannel.yml
查看运行的容器
9、在server2(node节点)上:根据master节点初始化集群的结果提示,加入集群。
[root@server2 images]# kubeadm join 172.25.66.1:6443 --token m971hz.qvblb58fnknbprsb --discovery-token-ca-cert-hash sha256:23d4a7cfa55bea7a0ee914c8e1ae4308184ebd1442d837f60b49d976980c6a3e
显示如下信息,表示加入集群的操作成功了
值的注意的是:如果第一次加入集群失败,需要执行命令"kubeadm reset"进行重置,重置之后再执行加入集群的命令
[root@server2 images]# modprobe ip_vs_sh
[root@server2 images]# modprobe ip_vs_wrr
查看server2上运行的容器
10、在server1(master节点)上:进行测试
-
获取默认namaspace(default)下的pod,以查看及全的所有节点的状态是否都是Ready。
-
获取所有namespace下的pod,以查看所有的pod的状态是否都是Running
从上图我们可以看到,由两个namespace的状态是CrashLoopBackOff,这是不正确的。那么该怎么解决呢?
1.在物理机上,设置iptables的策略,使得虚拟机server1,server2能上网[root@foundation66 k8s]# iptables -t nat -I POSTROUTING -s 172.25.66.0/24 -j MASQUERADE
做好iptables策略之后,稍等一会儿,(大概1分钟左右)再次查看状态,看是否是Running状态,如果不是,再执行第2步操作。一般执行第1步操作之后,就会成功。
2.执行命令删除,状态不是Running的namespace
[k8s@server1 ~]$ kubectl describe pod coredns-576cbf47c7-w74cd -n kube-system
[k8s@server1 ~]$ kubectl describe pod coredns-576cbf47c7-fsljr -n kube-system