1、安装前准备
1.1、集群IP分布
主机名 | IP地址 | 角色 | 备注 |
---|---|---|---|
kube-master | 192.168.168.60 | kube-master | 管理节点 |
kube-node1 | 192.168.168.61 | kube-node | 计算节点 |
kube-node2 | 192.168.168.62 | kube-node | 计算节点 |
kube-node3 | 192.168.168.63 | kube-node | 计算节点 |
repo | 192.168.168.72 | registry | yum安装源,私有仓库 |
1.2、修改主机名与本地hosts解析,dns(dns略)
[root@h60 ~]# echo kube-master > /etc/hostname
[root@h61 ~]# echo kube-node1 > /etc/hostname
[root@h62 ~]# echo kube-node2 > /etc/hostname
[root@h63 ~]# echo kube-node3 > /etc/hostname
[root@kube-node3 ~]# cat /etc/hosts
192.168.168.60 kube-master
192.168.168.61 kube-node1
192.168.168.62 kube-node2
192.168.168.63 kube-node3
1.3、从节点安装docker
> # 在node1~3上操作
[root@kube-node3 ~]# yum -y install docker #安装 docker
[root@kube-node3 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #开启路由转发
[root@kube-node3 ~]# sysctl -p #让配置立刻生效
[root@kube-node3 ~]# systemctl start docker
[root@kube-node3 ~]# systemctl enable docker
[root@kube-node3 ~]# systemctl stop/disable firewalld
[root@kube-node3 ~]# setenforce 0
1.4、配置私有仓库harbor
略
2、配置本地镜像源
2.1、配置本地k8s镜像源
[root@soft72 localrepo]# pwd
/var/www/html/localrepo
[root@soft72 localrepo]# ls
containernetworking-cni-0.6.0-3.el7.x86_64.rpm kubernetes-kubeadm-1.10.3-0.el7.x86_64.rpm
etcd-3.3.11-2.el7.centos.x86_64.rpm kubernetes-master-1.10.3-0.el7.x86_64.rpm
flannel-0.7.1-4.el7.x86_64.rpm kubernetes-node-1.10.3-0.el7.x86_64.rpm
kubernetes-1.10.3-0.el7.x86_64.rpm repodata
kubernetes-client-1.10.3-0.el7.x86_64.rpm
]# cat /etc/yum.repos.d/local-k8s.repo
[my-k8s-repo]
name=my-k8s-repo
baseurl=http://harbor.soft72.com/localrepo
enabled=1
gpgcheck=0
2.2、master与node镜像源如下
[root@kube-master ~]# cat /etc/yum.repos.d/local-k8s.repo
[my-k8s-repo]
name=my-k8s-repo
baseurl=http://harbor.soft72.com/localrepo
enabled=1
gpgcheck=0
3、安装部署kube-master
3.1、etcd安装配置(master)
- 安装
[root@kube-master ~]# yum -y install etcd #安装 etcd(键值型数据库)
- 改配置
[root@kube-master ~]# vim /etc/etcd/etcd.conf
6 ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #修改监听的客户端地址,0.0.0.0 指监听所有的主机
[root@kube-master ~]# systemctl start etcd.service
[root@kube-master ~]# systemctl enable etcd.service
- 创建配置网络
在 etcd 中,创建网络,mk 创建键值对 ——> 创建网络(后面课程配置)
[root@kube-master ~]# etcdctl mk /atomic.io/network/config '{"Network":"10.254.0.0/16","Backend":{"Type":"vxlan"}}'
[root@kube-master ~]# etcdctl ls / #查看
[root@kube-master ~]# etcdctl ls /atomic.io
[root@kube-master ~]# etcdctl ls /atomic.io/network
[root@kube-master ~]# etcdctl get /atomic.io/network/config #验证,查看 etcd 中的键值
对,确认网络配置
3.2 flannel安装配置(master+node)
- 安装
[root@kube-node1 ~]# yum -y install flannel
[root@kube-node1 ~]# vim /etc/sysconfig/flanneld
4 FLANNEL_ETCD_ENDPOINTS="http://192.168.168.60:2379" #指定etcd
># etcd 中已定义了 flannel 网络地址:10.254.0.0/16
- 起服务
启动服务(flannel 服务必须在 docker 服务之前启动)
[root@kube-node1 ~]# systemctl stop docker
[root@kube-node1 ~]# systemctl enable flanneld
[root@kube-node1 ~]# systemctl start flanneld docker
- 查看
[root@kube-node1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.254.73.1 netmask 255.255.255.0 broadcast 0.0.0.0
...
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.254.73.0 netmask 255.255.255.255 broadcast 0.0.0.0
- 测试(node)
node上新开一个容器,各个节点相互ping,测试flannel网络
[root@kube-node1 ~]# docker run -d harbor.soft72.com:8080/public/nginx:latest
[root@kube-node1 ~]# docker inspect -f "{{.NetworkSettings.IPAddress}}" #查看IP
3.3、安装k8s-master
- 安装
[root@kube-master ~]# yum list kubernetes-* #检查 k8s 的安装软件包,必须是 1.10.3
[root@kube-master ~]# yum -y install kubernetes-master kubernetes-client
[root@kube-master ~]# ls /etc/kubernetes/
apiserver config controller-manager scheduler
- 修改 k8s 全局配置文件
[root@kube-master ~]# vim /etc/kubernetes/config
22 KUBE_MASTER="--master=http://192.168.168.60:8080" #指定k8s管理节点的IP地址
(指定 apiserver 的地址)
- 修改 apiserver 配置文件(master 主配置文件)
[root@kube-master ~]# vim /etc/kubernetes/apiserver
8 KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" #监听所有地址
17 KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.168.60:2379" #指定etcd地址
20 KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" #k8s集群默认IP端
23 KUBE_ADMISSION_CONTROL="--admission-control=Namespace
Lifecycle,LimitRanger,SecurityContextDeny,ResourceQuota"
> #定义 k8s 的交互和配置行为,删除 ServiceAccount(通讯的一种机制,使用秘钥认证,需要证书认证),在这里是内网通讯
> #不涉及安全性问题,所以本次 k8s 不采用证书认证,使用明文即可
- controller-manager scheduler 使用默认即可
- 启动
启动服务,设置三个服务的开机自启动
[root@kube-master ~]# systemctl enable kube-apiserver.service kube-controller-manager.service kube-scheduler.service
[root@kube-master ~]# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
[root@kube-master ~]# systemctl status kube-apiserver.service kube-controller-manager.service kube-scheduler.service
- 验证服务
[root@kube-master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
scheduler Healthy ok
4、安装部署kube-node
4.1、安装 kube-node
- 安装
[root@kube-node1 ~]# yum -y install kubernetes-node
- 修改 k8s 全局配置文件
[root@kube-node1 ~]# vim /etc/kubernetes/config
22 KUBE_MASTER="--master=http://192.168.168.60:8080" #指定 k8s 管理节点的 IP 地址
- 修改kubelet配置文件
[root@kube-node1 ~]# vim /etc/kubernetes/kubelet
># #修改 kubelet 监听地址,监听所有的 IP 地址,
> 5 KUBELET_ADDRESS="--address=0.0.0.0"
># master 在创建容器的时候需要和 kubelet 通讯,需要 IP
># 指定本机的主机名,master发现有节点来连接,需要知道节点的名称,才能进行通讯
> 11 KUBELET_HOSTNAME="--hostname-override=kube-node1" #与本机主机名一致
14 KUBELET_ARGS="--cgroup-driver=systemd --fail-swap-on=false
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig
--pod-infra-container-image=harbor.soft72.com:8080/public/pod-infrastructure:latest" #harbor中镜像地址
> #kubelet 扩展参数,自定义 kubelet 的子配置文件 kubelet.kubeconfig(使用客户端与服务器进行通讯的
># 时候服务器的地址和配置文件),kubelet 是用于监视 pod 的,这里指定被监听的 pod 镜像,kubelet.kubeconfig 是 kubelet 的配置文件的一部分,使用命令生成 kubelet.kubeconfig 文件内容
># 设置集群:/etc/kubernetes/kubelet.kubeconfig (默认没有)
># 编写 kubelet.kubeconfig 文件,将生成的信息,写入到 kubelet.kubeconfig 文件中
- 新建kubelet.kubeconfig文件
># 使用命令方式创建
kubectl config set-cluster local --server="http://192.168.168.60:8080"
kubectl config set-context --cluster="local" local
kubectl config set current-context local
kubectl config view
cat kubelet.kubeconfig
vim kubelet.kubeconfig
># #kubelet.kubeconfig 文件,之前并不存在
[root@kube-node1 ~]# vim /etc/kubernetes/kubelet.kubeconfig
apiVersion: v1
clusters:
- cluster:
server: http://192.168.168.60:8080
name: local
contexts:
- context:
cluster: local
user: ""
name: local
current-context: local
kind: Config
preferences: {}
users: []
- 上传 pod-infrastructure到harbor
- 起服务
[root@kube-node1 ~]# systemctl enable kubelet.service kube-proxy.service
[root@kube-node1 ~]# systemctl start kubelet.service kube-proxy.service
- 主控节点验证
[root@kube-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
kube-node1 Ready <none> 2d v1.10.3
kube-node2 Ready <none> 2d v1.10.3
kube-node3 Ready <none> 2d v1.10.3
5、安装kube-dashboard
5.1、部署
- 上传dashboard镜像到harbor仓库(略)
- 编辑dashboard配置文件
> [root@kube-master ~]# vim kube-dashboard.yaml
> 18 spec:
> 19 containers:
> 20 - name: kubernetes-dashboard
> 21 image: harbor.soft72.com:8080/public/kubernetes-dashboard-amd64:v1.8.3 #dashboard私有仓库地址
> 22 ports:
> 23 - containerPort: 9090
> 24 protocol: TCP
> 25 args:
> 26 - --apiserver-host=http://192.168.168.60:8080 #修改为Master的IP
- 创建dashboard容器
[root@kube-master ~]# kubectl create -f kube-dashboard.yaml
deployment.apps "kubernetes-dashboard" created
service "kubernetes-dashboard" created
- 验证
> [root@kube-node2 ~]# docker ps #pod随机分配到了node2节点上
> 验证
> http://192.168.168.62:30090