Kubernetes 简称k8s,是谷歌于2014年开始主导的开源项目,提供了以容器为中心的部署、伸缩和运维平台。截止目前它的最新版本为1.2。搭建环境之前建议先了解一下kubernetes的相关知识,可以参考 《如果有10000台机器,你想怎么玩?》 系列文章。本文介绍kubernetes的安全性配置。
准备工作
首先需要搭建kubernetes集群环境,可以参考 《轻松搭建Kubernetes 1.2版运行环境》 来安装自己的kubernetes集群,运行到flannel配置完成即可。接下来的api server等设置的参数可以参考本文。
结果应该是有三台虚拟机,一台叫做 master ,它的IP是 192.168.33.17 ,运行着k8s的api server、controller manager和scheduler;另两台叫做 node1 和 node2 ,它们的IP分别是 192.168.33.18 和 192.168.33.19 ,运行着k8s的kubelet和kube-proxy,当做k8s的两个节点。
部署
最简单的方式就是通过基于CSV的基本认证。首先需要创建api server的基本认证文件:
cd ~
mkdir security
echo 123456,admin,qinghua > security/basic_auth.csv # 格式:用户名,密码,用户ID
然后就可以生成CA和api server的证书了:
cd security
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=192.168.33.17" -days 10000 -out ca.crt
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=192.168.33.17" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000
cd ..
上面的命令会生成若干证书相关文件,作用如下:
- ca.key:自己生成的CA的私钥,用于模拟一个CA
- ca.crt:用自己的私钥自签名的CA证书
- server.key:api server的私钥,用于配置api server的https
- server.csr:api server的证书请求文件,用于请求api server的证书
- server.crt:用自己模拟的CA签发的api server的证书,用于配置api server的https
接下来启动api server,参数的作用可以参考 kube-apiserver官方文档 :
docker run -d \
--name=apiserver \
--net=host \
-v /home/vagrant/security:/security \
gcr.io/google_containers/kube-apiserver:e68c6af15d4672feef7022e94ee4d9af \
kube-apiserver \
--advertise-address=192.168.33.17 \
--admission-control=ServiceAccount \
--insecure-bind-address=0.0.0.0 \
--etcd-servers=http://192.168.33.17:4001 \
--service-cluster-ip-range=11.0.0.0/16 \
--tls-cert-file=/security/server.crt \
--tls-private-key-file=/security/server.key \
--secure-port=443 \
--basic-auth-file=/security/basic_auth.csv
还需要启动controller manager,参数的作用可以参考 kube-controller-manager官方文档 :
docker run -d \
--name=cm \
-v /home/vagrant/security:/security \
gcr.io/google_containers/kube-controller-manager:b9107c794e0564bf11719dc554213f7b \
kube-controller-manager \
--master=192.168.33.17:8080 \
--cluster-cidr=10.245.0.0/16 \
--allocate-node-cidrs=true \
--root-ca-file=/security/ca.crt \
--service-account-private-key-file=/security/server.key
最后是scheduler,参数的作用可以参考 kube-scheduler官方文档 :
docker run -d \
--name=scheduler \
gcr.io/google_containers/kube-scheduler:903b34d5ed7367ec4dddf846675613c9 \
kube-scheduler \
--master=192.168.33.17:8080
可以运行以下命令来确认安全配置已经生效:
curl -k -u admin:123456 https://127.0.0.1/
curl -k -u admin:123456 https://127.0.0.1/api/v1
最后启动kubelet和kube-proxy,参数的作用可以参考 kubelet官方文档 和 kube-proxy官方文档 :
NODE_IP=`ifconfig eth1 | grep 'inet addr:' | cut -d: -f2 | cut -d' ' -f1`
sudo kubernetes/server/bin/kubelet \
--api-servers=192.168.33.17:8080 \
--cluster-dns=11.0.0.10 \
--cluster-domain=cluster.local \
--hostname-override=$NODE_IP \
--node-ip=$NODE_IP > kubelet.log 2>&1 &
sudo kubernetes/server/bin/kube-proxy \
--master=192.168.33.17:8080 \
--hostname-override=$NODE_IP > proxy.log 2>&1 &
验证
如果需要通过https访问,kubectl的命令就略微有点儿麻烦了,需要用 basic_auth.csv
里配置的 admin/123456
来登录:
~/kubernetes/server/bin/kubectl -s https://192.168.33.17 --insecure-skip-tls-verify=true --username=admin --password=123456 get po
因为8080端口还开着,所以也可以通过http访问:
~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 get po
配置完成后,可以看到系统里有TYPE为 kubernetes.io/service-account-token
的秘密:
~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 get secret
里面有三条数据,分别是 ca.crt
, namespace
和 token
,可以通过以下命令看到:
~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 describe secret
如果你通过kubernetes启动了一个pod,就可以在容器的 /var/run/secrets/kubernetes.io/serviceaccount/
目录里看到以三个文件的形式看到这三条数据(这是 --admission-control=ServiceAccount
的功劳),当pod需要访问系统服务的时候,就可以使用它们了。可以使用以下命令看到系统的服务账号:
~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 get serviceAccount
简化kubectl
如果我们通过设置 --insecure-port=0
把api server的http端口关闭,那它就只能通过https访问了:
docker rm -f apiserver
docker run -d \
--name=apiserver \
--net=host \
-v /home/vagrant/security:/security \
gcr.io/google_containers/kube-apiserver:e68c6af15d4672feef7022e94ee4d9af \
kube-apiserver \
--advertise-address=192.168.33.17 \
--admission-control=ServiceAccount \
--insecure-bind-address=0.0.0.0 \
--etcd-servers=http://192.168.33.17:4001 \
--service-cluster-ip-range=11.0.0.0/16 \
--tls-cert-file=/security/server.crt \
--tls-private-key-file=/security/server.key \
--secure-port=443 \
--basic-auth-file=/security/basic_auth.csv \
--insecure-port=0
这样的话,就连取个pod都得这么麻烦:
~/kubernetes/server/bin/kubectl -s https://192.168.33.17 --insecure-skip-tls-verify=true --username=admin --password=123456 get po
幸运的是,kubernetes提供了一种方式,让我们可以大大简化命令,只用这样就好了:
~/kubernetes/server/bin/kubectl get po
下面就让我们来试一下吧!首先用 kubectl config
命令来配置admin用户:
~/kubernetes/server/bin/kubectl config set-credentials admin --username=admin --password=123456
然后是api server的访问方式,给集群起个名字叫qinghua:
~/kubernetes/server/bin/kubectl config set-cluster qinghua --insecure-skip-tls-verify=true --server=https://192.168.33.17
接下来创建一个context,它连接用户admin和集群qinghua:
~/kubernetes/server/bin/kubectl config set-context default/qinghua --user=admin --namespace=default --cluster=qinghua
最后设置一下默认的context:
~/kubernetes/server/bin/kubectl config use-context default/qinghua
然后就可以用我们的简化版啦:
~/kubernetes/server/bin/kubectl get po
可以通过以下命令来看到当前kubectl的配置:
~/kubernetes/server/bin/kubectl config view
能够看到如下内容:
apiVersion: v1
clusters:
- cluster:
insecure-skip-tls-verify: true
server: https://192.168.33.17
name: qinghua
contexts:
- context:
cluster: qinghua
namespace: default
user: admin
name: default/qinghua
current-context: default/qinghua
kind: Config
preferences: {}
users:
- name: admin
user:
password: "123456"
username: admin
实际上这些配置都存放在 ~/.kube/config
文件里:
cat ~/.kube/config
修改这个文件也可以实时生效。细心的童鞋们可以看到,cluster、context和users都是集合,也就是说如果需要切换用户和集群等,只需要设置默认context就可以了,非常方便。
http://www.tuicool.com/articles/byUnQn7
相关推荐
通过阅读《Kubernetes in Action》这本书,读者将全面了解Kubernetes生态系统,学会如何有效地利用Kubernetes来构建、管理和扩展分布式应用。无论是初学者还是经验丰富的DevOps工程师,都能从中受益匪浅,提升自己的...
总之,Kubernetes工作坊提供了一个全面的平台,让开发者和运维人员了解并掌握Kubernetes的关键特性,提升他们在云原生环境下的应用管理能力。通过实际操作,参与者能够深入理解Kubernetes如何简化微服务架构的复杂性...
- **可扩展性**: 通过使用扩展点(如自定义资源定义 CRDs),Kubernetes 允许用户轻松地扩展其功能。 #### 2.3 核心组件 详细介绍了 Kubernetes 中的关键组件,包括: - **etcd**: 用于存储 Kubernetes 集群的数据...
### Kubernetes基础入门知识点详解 #### 一、Kubernetes简介与基本概念 **1.1 Introduction** ...以上就是关于Kubernetes的基础入门知识点详解,希望能帮助读者快速了解和掌握Kubernetes的相关知识。
【Kubernetes 使用教程及 Nginx 配置】 Kubernetes,简称 k8s,是...在实际操作中,需要了解 Kubernetes API、YAML 文件配置、命令行工具(kubectl)以及 Nginx 配置原理,以便更好地利用这些工具来管理和优化应用部署。
首先,我们需要了解Kubernetes的基本概念。Kubernetes由一系列组件组成,如etcd(用于存储集群状态的键值存储)、API Server(处理集群操作的入口)、Controller Manager(负责执行各种控制器)和Scheduler(负责...
2. 配置Gimbal以连接到Kubernetes和OpenStack集群,包括认证和授权设置。 3. 设定路由规则,根据业务需求定义流量如何在集群间流动。 4. 监控和调整,持续优化路由策略以满足性能和可靠性要求。 文件`heptio-gimbal...
"Official Java client library for Kubernetes.zip" 包含了官方提供的Java SDK,这个SDK使得开发人员能够轻松地创建、管理和操作Kubernetes资源,如Pods、Services、Deployments、ReplicaSets等。 首先,我们需要...
`kubernetes-client` 是一个强大的工具,它提供了丰富的API接口,使得开发人员可以轻松地在Scala程序中创建、更新、删除Pods、Services、Deployments、ConfigMaps等Kubernetes资源。这个客户端库是Kubernetes社区...
通过学习这个项目,开发者不仅可以了解如何使用Go语言开发Kubernetes客户端,还能深入理解如何利用go-prompt库来增强命令行工具的功能。这有助于提升个人在容器编排和Go语言开发领域的技能,同时也为构建其他类似的...
描述中的“kubernetes-start”进一步强调了这是一个起点,我们将从基础开始,了解Kubernetes的基本概念、架构以及它如何与开发人员的工作流程相结合。C#标签提示我们将特别关注如何利用.NET框架和C#编程语言来利用...
你需要设置Vault客户端,配置所需的认证机制(可能是AWS IAM、Kubernetes Service Account等),然后调用适当的API来请求令牌。 6. **环境变量和卷挂载**: 为了将获取到的令牌传递给主应用容器,你可以将其写入一个...
在使用`k8s-api`时,开发者需要了解Kubernetes的基本概念,如命名空间、对象生命周期、资源配额等。同时,熟悉Clojure的语法和数据结构也是必要的。通过阅读`k8s-api`的文档,学习如何构造和发送请求,以及如何处理...
【containerum:Kubernetes的Web UI,具有团队合作和CICD支持】 ...通过对源代码的探索和学习,你可以了解到如何构建这样的Web UI,并且可能会发现一些高级功能和技巧,以提升你的Kubernetes管理体验。
Kubaj-Kubeauth的核心功能在于通过自动化的方式管理Google Cloud Platform (GCP) 上的不同Kubernetes集群认证信息。在GCP上,每个Kubernetes集群都有自己的身份认证机制,而Kubaj-Kubeauth能够帮助用户快速地在这些...
无论是对初学者还是经验丰富的管理员来说,它都是了解和操作 Kubernetes 集群不可或缺的一部分。通过提供的 YAML 文件、镜像和帮助文档,用户可以轻松地将 Dashboard 部署到自己的集群中,充分利用其功能。
总的来说,"prometheus-kubernetes"项目提供了跨云Kubernetes集群的统一监控解决方案,结合Prometheus的强大监控能力与Grafana的可视化功能,可以帮助开发者和运维人员实时了解和优化集群性能,确保服务的高可用性。...
首先,我们需要了解Kubernetes(简称K8s)的基本概念。Kubernetes是一个开源的容器编排系统,用于自动化容器化的应用部署、扩展和管理。它提供了一个高度可移植的平台,可以在公有云、私有云和本地环境之间无缝迁移...
Rook可以作为Ceph的管理工具,帮助用户在Kubernetes集群中轻松部署、扩展和维护Ceph集群。 在Rook 1.8.7版本中,我们可以期待以下关键特性: 1. **稳定性与兼容性**:Rook 1.8.7通常会包含对Kubernetes的最新稳定...
在CKA(Certified Kubernetes Administrator)认证考试中,考生可能需要安装此插件以完成某些特定任务或模拟操作。这款插件可能并不常见,因此在寻找和下载上可能会遇到困难。分享这个压缩包是为了帮助考生们更便捷...