环境的准备
由于考虑网络的问题,在公有云平台上申请了一台新加坡地域的Ubuntu机器,由于看到网上kubeadm安装都是使用Ubuntu 16.04 64bit版本,所以也申请了两台Ubuntu 16.04 64bit版本
备注:
在kubeadm支持的Ubuntu 16.04+, CentOS 7 or HypriotOS v1.0.1+三种操作系统
安装Docker
(1) 更新apt-get的源
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add
OK# echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list# apt-get update
(2) 安装Docker
# apt-get installdocker-engine# docker version
Client:
Version:1.11.2
API version:1.23
Go version:go1.5.4
Git commit:b9f10c9
Built:Wed Jun1 22:00:43 2016
OS/Arch:linux/amd64Server:
Version:1.11.2
API version:1.23
Go version:go1.5.4
Git commit:b9f10c9
Built:Wed Jun1 22:00:43 2016
OS/Arch:linux/amd64
安装kubernetes基础组件
安装kubelet kubeadm kubectl kubernetes-cni
# apt-get install -y kubelet kubeadm kubectl kubernetes-cni
安装kubernetes Master节点
# 设置网络的分配地址段为:192.168.0.0/16,部署master组件
# kubeadm init --pod-network-cidr=192.168.0.0/16[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks
[preflight] WARNING: docker version is greater than the most recently validated version. Docker version: 17.06.0-ce. Max validated version: 1.12
[certificates] Generated CA certificate and key.
[certificates] Generated API server certificate and key.
[certificates] API Server serving cert is signed for DNS names [VM-133-17-ubuntu kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.144.133.17]
[certificates] Generated API server kubelet client certificate and key.
[certificates] Generated service account token signing key and public key.
[certificates] Generated front-proxy CA certificate and key.
[certificates] Generated front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[apiclient] Created API client, waiting for the control plane to become ready
[apiclient] All control plane components are healthy after 79.000826 seconds
[token] Using token: 262500.83d33677d341d692
[apiconfig] Created RBAC rules
[addons] Applied essential addon: kube-proxy
[addons] Applied essential addon: kube-dnsYour Kubernetes master has initialized successfully!To start using your cluster, you need to run (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/configYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
http://kubernetes.io/docs/admin/addons/You can now join any number of machines by running the following on each node
as root:kubeadm join --token 262500.83d33677d341d692 10.144.133.17:6443
kubeadmin命令会自动
- 系统状态检查
- 生成token
- 生成自签名CA和可独断证书
- 生成kubeconfig用于kubelet连接API server
- 为Master组件生成Static Pod manifests,并放到
/etc/kubernetes/manifests
目录中 - 配置RBAC并设置Master node只运行控制平面组件
- 创建附加服务,比如kube-proxy和kube-dns
在安装完Master节点后,查看节点信息会发现节点的状态为noready。查看noready的原因发现是由于cni插件没有配置。其实这是由于还没有配置网络。可以配置多种网络,这里作者选用最长远的fannel网络进行配置。
kubectl create -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel-rbac.yml
kubectl create -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
至此master节点已经安装完成,master节点已经处于ready状态。
# kubectl get nodes-s https://10.144.133.17:6443--kubeconfig=/etc/kubernetes/admin.conf
NAMESTATUSAGEVERSION
vm-133-17-ubuntuReady3hv1.7.0
添加kubernetes slave节点
kubeadmin正常的流程是:
# kubeadm join --token 262500.83d33677d341d692 10.144.133.17:6443[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[preflight] Running pre-flight checks
[preflight] WARNING: docker version is greater than the most recently validated version. Docker version: 17.06.0-ce. Max validated version: 1.12
[discovery] Trying to connect to API Server "10.144.133.17:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://10.144.133.17:6443"
[discovery] Cluster info signature and contents are valid, will use API Server "https://10.144.133.17:6443"
[discovery] Successfully established connection with API Server "10.144.133.17:6443"
[bootstrap] Detected server version: v1.7.0
[bootstrap] The server supports the Certificates API (certificates.k8s.io/v1beta1)
[csr] Created API client to obtain unique certificate for this node, generating keys and certificate signing request
[csr] Received signed certificate from the API server, generating KubeConfig...
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"Node join complete:
* Certificate signing request sent to master and response
received.
* Kubelet informed of new secure connection details.Run 'kubectl get nodes' on the master to see this machine join.
但实际中在添加slave节点中,遇到了v1.7的debug。具体的issue链接kubeadmin #335。
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:controller:bootstrap-signer
namespace: kube-public
rules:
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- list
- watch
- apiGroups:
- ""
resourceNames:
- cluster-info
resources:
- configmaps
verbs:
- update
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:controller:bootstrap-signer
namespace: kube-public
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: system:controller:bootstrap-signer
subjects:
- kind: ServiceAccount
name: bootstrap-signer
namespace: kube-system
自行对应的Yaml的创建操作后,添加可以成功。但是仍然无法在master上查看到对应主机的信息。
对应的修复方式为:
# scp -r ubuntu@10.144.133.17:/etc/kubernetes/admin.conf /etc/kubernetes# ln -s -f admin.conf kubelet.conf# service kubelet restart
至此slave节点也安装成功。
其他信息
(1) 指定版本创建
# kubeadm init --kubernetes-version=v1.6.1 --pod-network-cidr=10.244.0.0/16
(2) 获取加入节点的token
# kubeadm token list
TOKENTTLEXPIRESUSAGESDESCRIPTION
17a2fb.ce1bd59ce494f837authentication,signingThe default bootstrap token generated by 'kubeadm init'.
(3)创建全通的网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all
spec:
podSelector:
ingress:
- {}
参考链接:
【kubernetes|Ubuntu 16.04下kubeadm安装Kubernetes】https://kubernetes.io/docs/getting-started-guides/kubeadm/
https://kubernetes.io/docs/concepts/cluster-administration/addons/
https://kubernetes.io/docs/concepts/services-networking/network-policies/
https://kubernetes.io/docs/admin/kubeadm/#config-file
推荐阅读
- linux|2022年云原生趋势
- 个人日记|K8s中Pod生命周期和重启策略
- k8s|Scheduling Framework 与 Extender对比及详细介绍
- k8s|k8s(六)(配置管理与集群安全机制)
- Go|Docker后端部署详解(Go+Nginx)
- docker|Docker
- 【快速学习】docker构建java项目实践
- 云原生应用之旅—Kubernetes成长记 | 第十站(获取云原生旅行秘籍)
- Alpine Docker 安装 bash
- K8s自动化运维平台