kubernetes(k8s)中文文档参考
http://docs.kubernetes.org.cn/
一.Kubernetes介绍
Kubernetes一个用于容器集群的自动化部署、扩容以及运维的开源平台。
1.Kubernetes可以做什么?
使用Web服务,用户希望应用程序能够7*24小时全天运行,开发人员希望每天多次部署新的应用版本。通过应用容器化可以实现这些目标,使应用简单、快捷的方式更新和发布,也能实现热更新、迁移等操作。使用Kubernetes能确保程序在任何时间、任何地方运行,还能扩展更多有需求的工具/资源。Kubernetes积累了Google在容器化应用业务方面的经验,以及社区成员的实践,是能在生产环境使用的开源平台。
2.Kubernetes基础模块
1.创建一个KUBERNETES集群
2.部署应用程序
3.查看应用程序
4.发布应用程序
5.扩展应用程序
6.更新应用程序
3.Kubernetes特点:
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
可扩展: 模块化, 插件化, 可挂载, 可组合
自愈: 自动布置,自动重启,自动复制,自动扩展
二.创建一个KUBERNETES集群
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。
1.保证虚拟机能上网
在真机root用户中(真机可以上网):
[root@foundation70 ~]# ifconfig
写策略:
[root@foundation70 ~]# iptables -t nat -A POSTROUTING -o wlp3s0 -j SNAT --to-source 192.168.43.173
在虚拟机中配置网关(这里配置全局网关)
[root@server3 ~]# vim /etc/sysconfig/network
[root@server3 ~]# ping www.baidu.com #此时虚拟机就可以上网了
server3: 172.25.70.3 (k8s-master)
server4: 172.25.70.4 (k8s-node1)
server5: 172.25.70.5 (k8s-node2)
2.在server3中
安装docker(server3,server4,server5都安装,步骤如下)
[root@server3 docker]# ls
container-selinux-2.21-1.el7.noarch.rpm
docker-ce-18.06.1.ce-3.el7.x86_64.rpm
libsemanage-2.5-8.el7.x86_64.rpm
libsemanage-python-2.5-8.el7.x86_64.rpm
pigz-2.3.4-1.el7.x86_64.rpm
policycoreutils-2.5-17.1.el7.x86_64.rpm
policycoreutils-python-2.5-17.1.el7.x86_64.rpm
[root@server3 docker]# yum install -y *
[root@server3 docker]# systemctl start docker
安装Kubernetes集群相关软件(已获得)
[root@server3 k8s]# yum install -y kubeadm-1.12.2-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm kubectl-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm cri-tools-1.12.0-0.x86_64.rpm
关闭swap分区
[root@server3 k8s]# swapoff -a
[root@server3 k8s]# vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
设置开机自启
[root@server3 k8s]# systemctl enable kubelet
配置仓库, 在https://cloud.docker.com/ 网站注册一个账号,获得加速器地址
[root@server3 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://8h1lqkho.mirror.aliyuncs.com"]
}
3.在server4和server5中也要安装kubeadm-1.12.2-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm kubectl-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm cri-tools-1.12.0-0.x86_64.rpm,以及关闭swap分区
安装
[root@server4 ~]# yum install -y kubeadm-1.12.2-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm kubectl-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm cri-tools-1.12.0-0.x86_64.rpm
[root@server5 ~]# yum install -y kubeadm-1.12.2-0.x86_64.rpm kubelet-1.12.2-0.x86_64.rpm kubectl-1.12.2-0.x86_64.rpm kubernetes-cni-0.6.0-0.x86_64.rpm cri-tools-1.12.0-0.x86_64.rpm
关闭swap分区
[root@server4 ~]# swapoff -a
[root@server5 ~]# swapoff -a
注释swap
[root@server4 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
[root@server5 ~]# vim /etc/fstab
#/dev/mapper/rhel-swap swap swap defaults 0 0
设置服务开机自启
[root@server4 ~]# systemctl enable kubelet.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.
[root@server5 ~]# systemctl enable kubelet.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.
4.查看 kubeadm 会用到的镜像
[root@server3 ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.12.2
k8s.gcr.io/kube-controller-manager:v1.12.2
k8s.gcr.io/kube-scheduler:v1.12.2
k8s.gcr.io/kube-proxy:v1.12.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.2
5.导入需要的镜像
[root@server3 k8s]# docker load -i kube-apiserver.tar
[root@server3 k8s]# docker load -i kube-controller-manager.tar
[root@server3 k8s]# docker load -i kube-scheduler.tar
[root@server3 k8s]# docker load -i kube-proxy.tar
[root@server3 k8s]# docker load -i pause.tar
[root@server3 k8s]# docker load -i etcd.tar
[root@server3 k8s]# docker load -i coredns.tar
再导入flannel镜像
[root@server3 k8s]# docker load -i flannel.tar
6.初始化
[root@server3 k8s]# vim kube-flannel.yml
初始化时可能不是一次就能成功,出现错误要及时排除,我这里初始化出现的问题和解决方法如下
[root@server3 k8s]# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.25.70.3
WARING可解决也可不解决:
[WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
解决:
[root@server3 k8s]# systemctl enable docker
第一个EROOR:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决:
[root@server3 k8s]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
第二个EROOR:
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
解决:
[root@server3 k8s]# echo "1" >/proc/sys/net/ipv4/ip_forward
当初始化时出现端口被占用无法初始化时就重启kubeadm服务重新初始化就好
[ERROR Port-xxxx]: Port xxxx is in use
解决:
[root@server3 ~]# kubeadm reset
查看kubelet日志的方式 :
[root@server3 k8s]# journalctl -xeu kubelet
重新初始化
[root@server3 k8s]# kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.25.70.3
Your Kubernetes master has initialized successfully!
最后一行之后会用到
kubeadm join 172.25.70.3:6443 --token kijb1j.6k3iy5fcn0gliwr9 --discovery-token-ca-cert-hash sha256:683506b1cec9ca7a9eb87766162ffdf11f5b565cf2aed076eada71c37b62727b
7.新建k8s 用户, 设置环境
[root@server3 k8s]# useradd k8s
[root@server3 k8s]# vim /etc/sudoers #发现文件只读,所以要加权限
[root@server3 k8s]# chmod u+w /etc/sudoers
[root@server3 k8s]# vim /etc/sudoers
92 k8s ALL=(ALL) NOPASSWD:ALL
[root@server3 k8s]# su - k8s
[k8s@server3 ~]$ mkdir -p $HOME/.kube
[k8s@server3 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[k8s@server3 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
8.为了方便我们可以使命令补齐
[k8s@server3 ~]$ echo "source <(kubectl completion bash)" >> ./.bashrc
[k8s@server3 ~]$ logout #退出重新登陆才会生效
[root@server3 ~]# su - k8s
Last login: Fri May 31 06:22:43 CST 2019 on pts/0
[k8s@server3 ~]$ kubectl
alpha auth convert drain label proxy taint
annotate autoscale cordon edit logs replace top
api-resources certificate cp exec options rollout uncordon
api-versions cluster-info create explain patch run version
apply completion delete expose plugin scale wait
attach config describe get port-forward set
9.在master部署flannel
[root@server3 k8s]# cp kube-flannel.yml /home/k8s
[root@server3 k8s]# su - k8s
Last login: Fri May 31 06:23:41 CST 2019 on pts/0
[k8s@server3 ~]$ kubectl apply -f kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
[k8s@server3 ~]$ sudo docker ps #查看正在运行的容器
10.根据master节点初始化集群的结果,加入集群
(server4和server5步骤一样)
[root@server4 ~]# modprobe ip_vs_sh
[root@server4 ~]# modprobe ip_vs_wrr
[root@server4 ~]# systemctl enable docker
[root@server4 docker]# kubeadm join 172.25.70.3:6443 --token kijb1j.6k3iy5fcn0gliwr9 --discovery-token-ca-cert-hash sha256:683506b1cec9ca7a9eb87766162ffdf11f5b565cf2aed076eada71c37b62727b #出现问题可以参考之前初始化的方法
在master节点查看节点信息
[k8s@server3 ~]$ kubectl get nodes
11.在真机添加火墙策略
[root@foundation70 ~]# iptables -t nat -I POSTROUTING -s 172.25.70.0/24 -j MASQUERADE
12.查看所有namespaces的pod
[k8s@server3 ~]$ kubectl get pod --all-namespaces
删除状态有问题的,直到所有都是running
[k8s@server3 ~]$ kubectl delete pod coredns-576cbf47c7-g4xzt -n kube-system
[k8s@server3 ~]$ kubectl delete pod coredns-576cbf47c7-hkmzb -n kube-system
显示全部running即可