1 环境准备
1.1 服务器准备
服务器 | 节点 |
---|---|
192.168.0.7 | master节点 |
192.168.0.8 | node节点 |
192.168.0.9 | node节点 |
1.2 关闭防火墙
]# systemctl stop firewalld && systemctl disable firewalld
1.3 时间同步
]# dd
1.4 关闭swap分区
]# swapoff -a
]# vim /etc/fstab #在fstab中卸载
1.5 设置免密登陆
]# ssh-keygen
]# ssh-copy-id root@ip #三台都设置
1.6 配置系统内核参数
- 使流过网桥的流量也进入iptables/netfilter框架(如果报错,提示没有文件 modprobe br_netfilter 添加此模块)
]# echo -e 'net.bridge.bridge-nf-call-iptables = 1 \nnet.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.conf && sysctl -p
2 配置yum源及k8s相关组件安装
2.1 注意:
所有节点都要这样操作
]# cd /etc/yum.repos.d
]# yum install wget -y
]# rm -f CentOS-*
]#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
]#wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
]#cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
]#wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
]#rpm -import rpm-package-key.gpg #安装key文件
]#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
]#yum clean all && yum makecache fast (更新源信息)
2.2 安装kubeadm 相关组件
]# cd
]# yum -y install kubelet kubeadm kubectl (默认下载最新版本)
]# yum install docker kubectl-1.10.0 kubeadm-1.10.0 kubelet-1.10.0 kubernetes-cni-0.6.0 (我个人选择的版本)
2.3 配置阿里云的加速器
- 由于有些不可描述的原因,我们无法去Google直接下载相关镜像,所以配置使用阿里云上的镜像,为了提高下载速度,需要配置阿里云的加速器。
地址: https://cr.console.aliyun.com/
2.4 最后重启相关服务,并且设置开机自启
]# systemctl daemon-reload
]# systemctl enable docker && systemctl restart docker
]# systemctl enable kubelet && systemctl restart kubelet
2.5 通过脚本下载k8s镜像
1.)1.10.0 版本下载:
~]# vim down_k8s.sh
#!/bin/bash
images=(kube-proxy-amd64:v1.10.0 kube-scheduler-amd64:v1.10.0 kube-controller-manager-amd64:v1.10.0 kube-apiserver-amd64:v1.10.0
etcd-amd64:3.1.12 pause-amd64:3.1 kubernetes-dashboard-amd64:v1.8.3 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8
k8s-dns-dnsmasq-nanny-amd64:1.14.8)for imageName in ${images[@]} ; do
docker pull keveon/$imageName
docker tag keveon/$imageName k8s.gcr.io/$imageName
docker rmi keveon/$imageName
done
2.)1.12.0版本下载:
#!/bin/bash
down_image_url=registry.cn-hangzhou.aliyuncs.com/kuberimages/
images=(kube-proxy:v1.12.3 kube-apiserver:v1.12.3 kube-controller-manager:v1.12.3 kube-scheduler:v1.12.3 etcd:3.2.24 coredns:1.2.2 flannel:v0.10.0-amd64 pause:3.1 kubernetes-dashboard-amd64:v1.10.0)for imageName in ${images[@]} ; do
docker pull ${down_image_url}$imageName
docker tag ${down_image_url}$imageName k8s.gcr.io/$imageName
docker rmi ${down_image_url}$imageName
done
3.)1.13.0 版本下载:
kubeadm init --apiserver-advertise-address=192.168.199.116 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.13.1 --pod-network-cidr=10.244.0.0/16
~]# sh down_k8s.sh
~]# docker images
3 初始化集群
- (仅在master节点操作)
3.1
]# kubeadm init --kubernetes-version=v1.10.0 --pod-network-cidr=10.244.0.0/16
#指定版本,需要与docker中的镜像版本一致,画红杠的地方一定要记住,找个地方保存起来
3.2 配置环境变量
]# mkdir -p $HOME/.kube
]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
或者:
]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
3.3 查看集群状态
]# kubectl get nodes
4 安装网络必要插件
- flannel:
(由于网络功能是作为插件存在的,k8s本身并不提供网络功能,所有我们需要自行安装,这里我们选择flannel)
4.1
- flannel项目地址:https://github.com/coreos/flannel,根据项目的部署手册进行如下操作
[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel或者:
[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
- flannel支持多种模型
VxLAN #vxLAN有以下两种模式
(1) vxlan #叠加网络或者隧道网络,通过封装网络报文的方式使不同网段的pod之间可以通讯
(2) Directrouting #直接使用主机的IP地作为网关,通过主机路由的方式与目标pod进行通讯,当目标pod与当前pod不在同一三层网络内,会自动降级为VxLAN模式
host-gw: Host GateWay #与VxLAN的Directrouting模式相同,当目标pod与当前pod不在同一三层网络内时,pod之间无法通讯
UDP: #早期由于Linux内核不支持VxLAN,host-gw又有非常高的入门门槛,udp是flannel最早期使用的模式,由于使用普通的udp报文通讯,性能非常差,在可以使用前面两种模式的情况下请勿使用该模式
#默认flannel的模式为vxlan,可以修改为性能更好的directrouting模式,修改见下图
4.2
5将所有node节点加入master节点
5.1
- 之前有个让复制的命令
- 所有node节点执行一次
- 执行后提示红框信息则表示成功
5.2 在master节点查看
- 注意:
刚添加完node节点的运行状态可能是 NotReady,等过几分钟就好了,如果一直没有变。那可能是网络插件安装有问题,请检查网络插件。
6 k8s常用命令说明
- kubectl get #获取信息
]#kubectl get pods #查看pod
]#kubectl get deployment #资源类型
]#kubectl get service #查看中间层service,相当于DNAT
]#kubectl get ns #获取名称空间
]#kubectl get pods -n kube-system -o wide #获取kube-system名称空间下的pod并展示详细信息
-n 后面接名称空间
-o ouput形式支持 wide/yaml/json
]#kubectl get pods -n develop --show-labels # 显示develop名称空间下pod的标签
]#kubectl get pods --show-labels -l xxx # -l后面跟标签选择器或表达式,如: app=nginx,app!=nginx, “app in(nginx,ngx-app,xxx)”
]#kubectl get pods --show-labels -l xxx -L xxx # -L 新定义一行来显示指定键值
- kubectl create # 创建资源
]#kubectl create deploy xxx --image=xxx #如果没有指定Namespace,创建的容器默认是在default ns下
- kubectl delete #删除资源
]#kubectl delete deployment xxx
]#kubectl delete pods xxx
]#kubectl delete service xxx
- kucectl describe #获取描述信息
]#kubectl describe service/xxx(service名称)
]#kubectl describe pod/xxx(pod名称)
- kubectl exec #进入指定容器 相当于docker exec
]#kubectl exec -it nginx-app-5jyvm -- /bin/bash
]#kubectl exec POD [-c CONTAINER] -- COMMAND [args...] [options]
#POD中有多个容器需要 -c containername 指定执行命令的容器
- kubectl attach # 连接pod
]#kubectl attach -it nginx-app-5jyvm(pod名称)
- kubectl scale # 扩容/缩容
]#kubectl scale --replicas=3 deploy/my-nginx(pod名称) # 将deploy下的my-nginx扩容为3个
- kubectl run --image=xxx name_xx --port #启动容器
]#kubectl run --image=nginx nginx-app --port=80
- kubectl expose #暴露端口
]#kubectl expose deployment nginx-app --type="NodePort" --port=80
in default,pods only deploy on node,not on master, please use the node ip to access
- kubectl logs #查看日志
]#kubectl logs -f nginx-app-zibvs(pod名称)
】#kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options] #POD中有多个容器需要 -c containername 指定执行命令的容器
- kubectl explain # 讲解每个资源属性
]#kubectl explain pod
- kubectl label # 标签操作
]#kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
]#kubectl label pods/dev-pod -n develop tier=frontend # 增减tier标签 同时添加多个标签,使用空格分隔标签即可
]#kubectl label --overwrite pods/dev-pod -n develop app=dev-ngx # overwrite app标签
]#kubectl label pods/dev-pod -n develop tier- # 删除tier标签, 使用“键名-”表示删除
- kubectl annotate # 注解 类似于label操作
]#kubectl annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
- kubectl patch #打补丁更新,支持json和yaml格式
]#kubectl patch (-f FILENAME | TYPE NAME) -p PATCH [options]
]#kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
- kubectl rollout # 回滚
]#kubectl rollout SUBCOMMAND [options]
]#kubectl rollout status deployment myapp-deploy # 查看回滚状态
]#kubectl rollout history deployment myapp-deploy # 查看历史版本
]#kubectl rollout undo deployment myapp-deploy --to-revision=1 # 回滚到第1版