2.1 k8s的安装与配置
2.1.1 准备工作
以centOs为例
查看Linux系统版本的命令
1、cat /etc/issue,此命令也适用于所有的Linux发行版。
[root@S-CentOS home]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
2、cat /etc/redhat-release,这种方法只适合Redhat系的Linux:
[root@S-CentOS home]# cat /etc/redhat-release
CentOS release 6.5 (Final)
参考:https://www.cnblogs.com/klb561/p/9157569.html
查看防火墙状态
systemctl status firewalld
systemctl stop firewalld
参考:https://blog.csdn.net/wade3015/article/details/90725871
主机上禁用SELinux,让容器可以读取文件系统
cat /etc/sysconfig/selinux
setenforce 0
2.1.2 使用kubeadm工具快速安装k8s集群
新建分支配置文件:
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
cat /etc/yum.repos.d/kubernetes.repo
安装kubelet\kubeadm\kubectl
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
说明:上面的操作需要在所有机器上处理
部署k8s master
说明:该操作仅需要在master节点执行,这里的apiserve需要修改成自己的master地址
kubeadm init \
--apiserver-advertise-address=192.168.73.138 \
--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
根据输出提示操作:
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
默认token的有效期为24小时,当过期之后,该token就不可用了,
如果后续有nodes节点加入,解决方法如下:
重新生成新的token
kubeadm token create
[root@k8s-master ~]# kubeadm token create
0w3a92.ijgba9ia0e3scicg
[root@k8s-master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
0w3a92.ijgba9ia0e3scicg 23h 2019-09-08T22:02:40+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
t0ehj8.k4ef3gq0icr3etl0 22h 2019-09-08T20:58:34+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
[root@k8s-master ~]#
获取ca证书sha256编码hash值
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a
节点加入集群
[root@k8s-node01 ~]# kubeadm join --token aa78f6.8b4cafc8ed26c34f --discovery-token-ca-cert-hash sha256:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538 192.168.73.138:6443 --skip-preflight-chec
加入k8s node
在两个 Node 节点执行
使用kubeadm join 注册Node节点到Matser
kubeadm join 的内容,在上面kubeadm init 已经生成好了
[root@k8s-node01 ~]# kubeadm join 192.168.4.34:6443 --token 2nm5l9.jtp4zwnvce4yt4oj \
--discovery-token-ca-cert-hash sha256:12f628a21e8d4a7262f57d4f21bc85f8802bb717dd6f513bf9d33f254fea3e89
安装网络插件
只需要在Master 节点执行
[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
修改镜像地址:(有可能默认不能拉取,确保能够访问到quay.io这个registery,否则修改如下内容)
[root@k8s-master ~]# vim kube-flannel.yml
image: lizhenliang/flannel:v0.11.0-amd64
[root@k8s-master ~]# cat -n kube-flannel.yml|grep lizhenliang/flannel:v0.11.0-amd64
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master ~]# ps -ef|grep flannel
查看集群的node状态,安装完网络工具之后,只有显示如下状态,所有节点全部都Ready好了之后才能继续后面的操作
测试Kubernetes集群
在Kubernetes集群中创建一个pod,然后暴露端口,验证是否正常访问:
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
[root@k8s-master ~]# kubectl get pods,svc
访问地址:http://NodeIP:Port ,此例就是:http://192.168.73.138:32039
部署 Dashboard
[root@k8s-master ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
[root@k8s-master ~]# vim kubernetes-dashboard.yaml
修改内容:
109 spec:
110 containers:
111 - name: kubernetes-dashboard
112 image: lizhenliang/kubernetes-dashboard-amd64:v1.10.1 # 修改此行
......
157 spec:
158 type: NodePort # 增加此行
159 ports:
160 - port: 443
161 targetPort: 8443
162 nodePort: 30001 # 增加此行
163 selector:
164 k8s-app: kubernetes-dashboard
[root@k8s-master ~]# kubectl apply -f kubernetes-dashboard.yaml
创建service account并绑定默认cluster-admin管理员集群角色:
[root@k8s-master ~]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created
[root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin
--serviceaccount=kube-system:dashboard-admin
[root@k8s-master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
参考:https://www.cnblogs.com/double-dong/p/11483670.html
2.1.4 k8s集群的安全设置
如果仅仅在内网中使用,则k8s的各个组件与master之间可以通过apiserver的非安全端口http://apiserver:8080进行访问。如果apiserver需要对外提供服务,则需要启用https安全机制。有如下两种方式:
1)基于CA签名的双向数字证书认证方式
2)基于http base或token的认证方式
2.1.5 k8s集群的网络配置
需要实现跨主机荣期间的网络互通,k8s优先使用CNI网络插件打通跨主机的容器网络。
2.1.6 内网中k8s相关配置
因为docker需要获取internet中的镜像等资源,而部分企业由于安全问题会无法访问Internet,所以可能需要创建私有的docker registry,并修改k8s的相关配置。
2.1.7 k8s的版本升级
1)获取最新的k8s二进制文件
2)挨个隔离Node,等待去廍容器工作完成后,更细kubelet和kube-proxy服务文件,然后重启两个服务
3) 更新master的kube-apiserver、kube-controller-manager、kube-scheduler服务文件并重启
2.2 kubectl命令行工具用法详解
2.2.1 概述
kubectl [command] [TYPE] [NAME] [flags]
command:子命令,操作k8s资源的命令,如create、delete、get、describe、apply等
TYPE:资源类型,区分大小写,如pod、clusters、deployments、nodes、services等,
NAME:资源对象的名称,区分大小写。如果不指定名称,则默认返回全部
2.2.2 子命令详解
2.2.3 参数列表
2.2.4 输出格式
2.2.5 操作实例
资源创建
kubectl create -f my-service.yaml -f my-rc.yaml #一次性创建service和rc
kubectl create -f <directory> #路径下所有的yaml yml json进行文件的创建
资源查看
kubectl get pods #查看所有pod列表
kubectl get service,rc
资源描述(详情)
kubectl describe nodes <node-name> #获取某规则资源的详情
kubectl describe pods/<pod-name>
kubectl describe pods <rc-name>
删除资源
kubectl delete -f pod.yml #基于yaml的定义删除pod
kubectl delete pods,services -l name=<label-name> #基于标签名称删除pod和service
kubectl delete pods -all #删除所有pod
执行容器命令
kubectl exec <pod-name> date #在某个pod中执行命令,默认第一个容器
kubectl exec <pod-name> -c <contianer-name> date #在指定pod的指定容器中执行
kubectl exec <pod-name> -c <contianer-name> /bin/bash
获取容器日志
kubectl logs <pod-name>
kubectl logs -f <pod-name> -c <container-name>
kubectl的基本指令:
kubectl create -f 我的配置文件
基于yaml文件创建对象
kubectl get pods -l app=nginx
从 Kubernetes 里面获取(GET)指定的 API 对象。可以看到,在这里我还加上了一个 -l 参数,即获取所有匹配 app: nginx 标签的 Pod。
kubectl describe pod nginx-deployment-67594d6bf6-9gdvr
kubectl describe 命令,查看一个 API 对象的细节
kubectl get deployments
kubectl describe deployment nginx-deployment
#推荐的yaml文件执行方式
kubectl apply -f nginx-deployment.yaml
进入Pod当中
$ kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw -- /bin/bash
# ls /usr/share/nginx/html
删除这个 Nginx Deployment
$ kubectl delete -f nginx-deployment.yaml
对nginx服务升级
1 修改yaml
...
spec:
containers:
- name: nginx
image: nginx:1.8 #这里被从1.7.9修改为1.8
ports:
- containerPort: 80
更新在 Kubernetes 里也生效:
$ kubectl replace -f nginx-deployment.yaml
我推荐你使用 kubectl apply 命令,来统一进行 Kubernetes 对象的创建和更新操作,具体做法如下所示:
$ kubectl apply -f nginx-deployment.yaml
# 修改nginx-deployment.yaml的内容
$ kubectl apply -f nginx-deployment.yaml