前言:
具体步骤:
- (一)系统环境初始化
(1)关闭防火墙、selinux:
systemctl stop firewalld && systemctl disable firewalld
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && setenforce 0
(2)设置主机名以及域名映射(hosts)
hostnamectl set-hostname master、node01、node02
/etc/hosts:
ip master
Ip node01
Ip node02
(3)设计系统时区并同步服务器
确认时间同步:
yum install -y chrony
systemctl enable --now chronyd
chronyc sources && timedatectl
(4)关闭swap交换分区:
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
备注:
Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。
修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。
(5)内核调整:kuber-proxy代理支持iptables和ipvs两种模式
方案一:使用ipvs模式需要在初始化集群前加载要求的ipvs模块并安装ipset工具。另外,针对Linux kernel 4.19以上的内核版本使用nf_conntrack 代替nf_conntrack_ipv4。
方案二:将桥接的IPv4流量传递到iptables的链:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system
- (二)安装docker
$wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
验证:Docker version 18.06.1-ce, build e68fc7a
可以再次验证(没必要):
docker run hello-world
- (三)K8s环境初始化
(1)添加kubernetes YUM软件源
vi /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
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
备注:
这里的两个秘钥地址分别对应gpgcheck和repo_gpgcheck。这里其实repo_gpgcheck可以省略。第二个秘钥链接也是不可少的,不然会安装失败
yum clean all
yum -y makecache
(2)安装kubeadm,kubelet和kubectl:所有主机都需要操作,由于版本更新频繁,这里指定版本号部署
$ yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
$ systemctl enable kubelet
备注一:
安装包说明:
kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm 用于初始化集群,启动集群的命令工具
kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
安装包说明二:
在部署kubernetes时,要求master node和worker node上的版本保持一致,否则会出现版本不匹配导致奇怪的问题出现。
备注二:
查看安装包提供的配置文件:
查看kubelet安装生成的文件:
rpm -ql kubelet
备注三:
启动服务后需要确保服务是否正常启动,如果没有正常启动,需要到/var/log/message查看日志
- (四)部署master节点
(1)初始化kubeadm
kubeadm init --apiserver-advertise-address=10.1.182.184 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
1)说明:当出现如下结果,表示初始化顺利
记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中。
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.1.182.184:6443 --token jzwzd9.3913rfwhi86x6cmq \
--discovery-token-ca-cert-hash sha256:b1301249df1fd1fdc71100e0cfd30bb23188316999b92dcde5f67aef1d36a289
2)参数说明:
选项非常多,不可能记得住,可以通过命令kubeadm init --help查看
--apiserver-advertise-address指定master的interface
--image-repository Kubenetes默认Registries地址是k8s.gcr.io,国内无法访问,
在1.13版本后可以增加–image-repository参数,将其指定为可访问的镜像地址,这里使用registry.aliyuncs.com/google_containers
--kubernetes-version指定的是k8s的版本,要求与kubeadm,kubelet和kubectl的版本一致
--service-cidr指定service 的IP 范围. (default "10.96.0.0/12")
pod-network-cidr来指定网络驱动的CIDR。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,flannel设置为 10.244.0.0/16,calico设置为192.168.0.0/16
备注:pod的IP在flannel的网段内。
验证部署验证:查看部署的组件是否健康
此时节点的状态是notready
(2)配置 kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具, Master 初始化完成后需要做一些配置工作才能使用kubectl(比如tab自动补全功能),参考初始化结果给出的命令进行以下配置:
根据输出提示操作:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
备注:部署master节点成功
kubectl get node
-
(五)部署node节点:node节点加入集群
在“node节点”上分别执行如下操作:执行kubeadm的kubeadm join的输出
Kubeadm join 10.1.182.184:6443 --token jzwzd9.3913rfwhi86x6cmq --discovery-token-ca-cert-hash sha256:b1301249df1fd1fdc71100e0cfd30bb23188316999b92dcde5f67aef1d36a289
再通过master节点查看node,发现node节点已以成功加入集群,并且Status状态为Ready:
-
(六)在master节点安装网络插件
备注:此步骤可以和第四步一起操作
(1)安装Pod网络插件(CNI)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
(2)查看是否部署成功:
kubectl get pods -n kube-system
(3)再次查看node,可以看到状态为ready
-
(七)测试Kubernetes集群
(1)在Kubernetes集群中创建一个pod,然后暴露端口,验证是否正常访问:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods,svc
(2)在浏览器访问测试
访问地址:http://NodeIP:Port
Node是masterip地址
port是nginx的30328端口
- (八)部署 Dashboard
- (1)下载并修改yaml:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
vi kubernetes-dashboard.yaml
(2)部署dasbboard
kubectl apply -f kubernetes-dashboard.yaml
(3)在火狐浏览器访问(google受信任问题不能访问)地址: https://NodeIP:30001
(4)dashboard运行在pod资源中,所以dashboard所在的Pod要以serviceaccount类型的用户身份认证到k8s集群上去访问k8s的api service组件
1)创建serviceaccount,用户名为dashboard-admin:
kubectl create serviceaccount dashboard-admin -n kube-system
2)通过clusterrolebinding绑定到内置的cluster-admin角色上:
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
3)查看登录的令牌:kubectl describe secrets -n kube-system dashboard-admin
或者kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')