CentOS部署k8s v1.16.7
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。其架构如下图所示:...
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。其架构如下图所示:
本文基于CentOS7.6,部署k8s v1.16.7,详细过程如下:
一、准备工作
1、k8s要求
CentOS:7.4+
Docker:19.03.4推荐,1.13.1, 17.03, 17.06, 17.09, 18.06 ,18.09也可以
硬件需求:CPU>=2c ,内存>=2G
准备2台机器,安装CentOS7.6。ip及主机名计划如下:
192.168.2.9 k8s-master
192.168.2.10 k8s-node1
2、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3、禁用SELINUX
vim /etc/selinux/config
将SELINUX设置为disabled:
SELINUX=disabled
4、修改主机名
#设置主机名,主机名不能带下划线
hostnamectl set-hostname k8s-master
通过hostname命令查看主机名。
5、关闭swap
修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载(永久关闭swap)
vim /etc/fstab
# 注释掉以下行,
/dev/mapper/centos-swap swap swap defaults 0 0
#验证(重启后生效,Swap行均为0)
[root@k8s-master /]# free -m
total used free shared buff/cache available
Mem: 7812 766 5376 58 1669 6670
Swap: 0 0 0
6、配置IP映射
vim /etc/hosts
最后增加以下内容:
192.168.2.9 k8s-master
192.168.2.10 k8s-node1
7、SSH免密码登录
在k8s-master上生成密钥,复制到其他节点上:
cd /root
ssh-keygen -t rsa
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
在/root目录下生成.ssh隐藏文件夹,将.ssh文件夹拷贝到其他机器,完成局域网多机器互信访问。
scp -r .ssh/ k8s-node1:/root/
8、修改内核参数
#命令行执行
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#手动加载所有的配置文件
sysctl --system
二、安装Docker
在k8s-master和k8s-node1上安装docker,此处安装docker-ce-18.06.3.ce,具体过程如下:
1、 安装必要的一些系统工具
#添加阿里云CentOS yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#命令行执行
yum install yum-utils device-mapper-persistent-data lvm2
2、添加docker源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装docker
# 查看Docker-CE版本
yum list docker-ce --showduplicates | sort -r
#安装Docker-CE
yum install docker-ce-18.06.3.ce
4、配置docker
创建/etc/docker/daemon.json,配置国内阿里云镜像加速,配置k8s官方推荐native.cgroupdriver=systemd,将docker默认目录改为大容量磁盘/data目录,最终配置如下:
{
"registry-mirrors":["https://6r8ktgi2.mirror.aliyuncs.com"],
"data-root":"/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
5、启动docker
#启动docker
systemctl start docker
#配置开机启动
systemctl enable docker
三、安装k8s
1、配置k8s阿里云源
由于官方k8s源在google,国内无法访问,这里使用阿里云源,在k8s-master和k8s-node1上命令行执行:
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl
安装
2、k8s-master节点安装
2.1、安装kubeadm、kubelet、kubectl
本处选用k8s 1.16系列最新版本1.16.7。
#如查看kubectl版本
yum list kubectl --showduplicates --nogpgcheck | sort -r
#安装k8s v1.16.7
yum install -y kubelet-1.16.7 kubeadm-1.16.7 kubectl-1.16.7
#启动kubelet服务
systemctl start kubelet
#配置开机启动kubelet服务
systemctl enable kubelet
kubeadm:用来初始化集群(Cluster),启动集群的命令工具
kubelet:运行在集群中的所有节点上,用于启动Pod和容器等对象的工具
kubectl:这个是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
2.2、初始化k8s
#执行kubeadm config images list查看所需镜像
[root@k8s-master ~]# kubeadm config images list
I0311 14:43:40.178181 15003 version.go:251] remote version is much newer: v1.17.3; falling back to: stable-1.16
k8s.gcr.io/kube-apiserver:v1.16.7
k8s.gcr.io/kube-controller-manager:v1.16.7
k8s.gcr.io/kube-scheduler:v1.16.7
k8s.gcr.io/kube-proxy:v1.16.7
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/coredns:1.6.2
#初始化k8s
kubeadm init --kubernetes-version=v1.16.7 --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.2.9 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
参数解释:
--kubernetes-version: 用于指定k8s版本
--apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 k8s-masterIP地址
--pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
--service-cidr:用于指定SVC的网络范围;默认10.96.0.0/12
--image-repository: 指定阿里云镜像仓库地址
k8s初始化执行过程较长,可能需要2分钟左右,最后返回如下信息:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.2.9:6443 --token dli7gh.dclgtwobuj6udsfq \
--discovery-token-ca-cert-hash sha256:04cb3862ef9f49d891b0d0555e19d01ad67eac2467980d34f7726956705b25ad
最后的kubeadm join命令是在从节点上执行,先记下,稍后从节点配置好再执行,如果忘记,使用kubeadm token create --print-join-command命令获取。输入一下命令完成k8s-master节点配置:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
查看节点状态,主节点为NotReady,继续进行后续配置:
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 19h v1.16.7
2.3、安装flannel
下载官网fannel配置文件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这个yml配置文件中配置了一个国内无法访问的地址(quay.io),将其替换为国内可以访问的地址(quay-mirror.qiniu.com)。
安装flannel
kubectl apply -f kube-flannel.yml
查看节点信息:
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 19h v1.16.7
3、k8s-node1节点安装
3.1、安装kubeadm、kubelet、kubectl
#安装k8s v1.16.7
yum install -y kubelet-1.16.7 kubeadm-1.16.7 kubectl-1.16.7
#启动kubelet服务
systemctl start kubelet
#配置开机启动kubelet服务
systemctl enable kubelet
3.2、加入集群
kubeadm join 192.168.2.9:6443 --token dli7gh.dclgtwobuj6udsfq \
--discovery-token-ca-cert-hash sha256:04cb3862ef9f49d891b0d0555e19d01ad67eac2467980d34f7726956705b25ad
如果忘记,可在k8s-master节点上执行kubeadm token create --print-join-command命令来获取。
在k8s-master上查看k8s节点信息:
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 19h v1.16.7
k8s-node1 Ready <none> 18h v1.16.7
4、安装Dashboard
k8s Dashboard是一个基于Web用户界面,用来管理k8s集群,并可展示集群的状态。k8s集群安装好后默认没有包含Dashboard,此处在k8s-master节点安装Dashboard。
4.1、下载Dashboard的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
4.2、配置recommended.yaml
添加NodePort,端口为30001,如下所示:
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #新加此行
ports:
- port: 443
nodePort: 30001 #新加此行
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
---
删除以下部分:
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs
namespace: kubernetes-dashboard
type: Opaque
---
4.3、创建用户admin-user
新建admin.yaml,内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
4.4、生成证书
正常安装部署完Kubernetes Dashboard后,通过Chrome浏览器不能访问,通常是由于部署Kubernetes Dashboard时生成的证书日期有问题,解决办法,可以通过自签证书的形式解决。
下面是生成 k8s dashboard 域名证书方法,任何一种都可以:
- 通过 https://freessl.cn 网站,在线生成免费1年的证书
- 通过 Let’s Encrypt 生成 90天 免费证书
- 通过 Cert-Manager 服务来生成和管理证书
我们这里没有域名,仅仅是通过ip访问测试,所以就通过openssl工具自签一个证书用于测试。
#生成证书key
openssl genrsa -out dashboard.key 2048
#生成证书csr,ip可为集群任意节点ip,此处设置为k8s-master节点ip
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=192.168.2.9'
#生成自签证书(证书默认过期时间365天,此处设置为3650天)
openssl x509 -days 3650 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
4.5、部署Dashboard
#部署dashboard
kubectl apply -f recommended.yaml
#创建用户
kubectl apply -f admin.yaml
查看服务状态
[root@k8s-master /]# kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.105.35.200 <none> 8000/TCP 18h
kubernetes-dashboard NodePort 10.109.159.254 <none> 443:30001/TCP 18h
4.6、创建dashboard的secret
kubectl create secret generic kubernetes-dashboard-certs -n kubernetes-dashboard --from-file=dashboard.crt=./dashboard.crt --from-file=dashboard.key=./dashboard.key
4.7、获取admin-user登录token
[root@k8s-master home]# kubectl describe secrets -n kubernetes-dashboard admin-user
Name: admin-user-token-kj95x
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: ac20a965-4db2-4fc6-aa89-408187912e88
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlIxTndJTEppT1MzT1c4Y0pBNHRvdkRhYnhPMDY0dFljdE5yU1pWY3o5Ym8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWtqOTV4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJhYzIwYTk2NS00ZGIyLTRmYzYtYWE4OS00MDgxODc5MTJlODgiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.blHlzuPpXhCOU5Akys-IOenPsCMZ1sBBngmC2-yi4XzsSVkgY9cO79iZtaIyKTnDoEQuqnnhTfHh47-AZ44xqAEPiMmNUaFehhsqeZfWIcjwecpY0DhqgBwOUrzFwOucTZgkn7FknnZknKZ58AYHBsf0T7GLYz_i2SSURnis7hSWqtjsrY1AzQA4K79pT1VlMb3Q2pr6UujIwyAeQdv4VSHaaDuU_Qd37_4FERMYI2RgIho9XdwQuqxEgMzgcMLdqkhp53LDw384lRHHkmYS85AqKtjLicmejnpp6Wk_BUR475oW1o1lDavA5ZnNf948VkgbZDLC835gC1-jCIMDww
在chrome浏览器输入https://192.168.2.9:30001,打开k8s集群Dashboard,如下图所示:
更多推荐
所有评论(0)