-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
support for asyncio #323
Comments
I've prepared the Pull request where I show how callbacks can be used with asyncio. Let me know what you think about it. Thanks. |
I just experimented with Swagger v2.3.1 which supports asyncio+aiohttp based client library generation, so that we could use a "native" async interface instead of interpolating callbacks to futures. What I have done to make it working, starting from the kubernetes-client/gen repository:
Then I could run the following example: import asyncio
from kubernetes import client, config
loop = asyncio.get_event_loop()
async def do():
config.load_kube_config()
v1 = client.CoreV1Api()
ret = await v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
loop.run_until_complete(do())
loop.close() So the majority of APIs can be converted to use asyncio + aiohttp without much efforts, thanks to Swagger. I hope my "manual" fix-ups could be automated somehow! |
|
I use aiohttp as a server which accesses the python-client so it will be very benefitial to me as well. |
Here's how you can do an async watch with the using client (minus error handling): class Connector(object):
def __init__(self, q: asyncio.Queue, loop: asyncio.AbstractEventLoop, timeout: int = 30):
client_config = type.__call__(Configuration)
config.load_kube_config(client_configuration=client_config, persist_config=False)
client = ApiClient(configuration=client_config)
self.__configuration = client_config
self.__v1 = CoreV1Api(client)
self.__extv1beta1 = ExtensionsV1beta1Api(client)
self.__queue = q
self.__loop = loop
async def start(self):
async with aiohttp.ClientSession() as session:
await asyncio.gather(
self.__watch(session=session, api=self.__v1, url='/api/v1/endpoints', kind='V1Endpoints'),
self.__watch(session=session, api=self.__v1, url='/api/v1/services', kind='V1Service'),
self.__watch(session=session, api=self.__extv1beta1, url='/apis/extensions/v1beta1/ingresses', kind='V1beta1Ingress'),
loop=self.__loop)
async def __watch(self, session: aiohttp.ClientSession, api, url: str, kind: str):
params = {'watch': 'true'}
async with session.get(self.__configuration.host + url, params=params,
headers=self.__configuration.api_key) as response:
while True:
chunk = await response.content.readline()
if not chunk:
break
j = json.loads(chunk)
j['object'] = api.api_client._ApiClient__deserialize(data=j['object'], klass=kind)
await self.add_event(j) |
At last I’ve prepared the new library kubernetes_asyncio which is based on this Python client, but uses the asyncio generator from swagger-codegen. I've added a script to create this client to kubernetes-client/gen repo in this PR kubernetes-client/gen#60. I've also decided to incorporate functionality from sub-repository kubernetes-client/python-base because a lot of changes according to asyncio were needed. Please take a look, thanks. |
Inspired by @tomplus I have followed in his footsteps and created aiokubernetes. Unlike kubernetes_asyncio, it is not backwards compatible. The user visible changes are actually minor but allowed me to remove unused Python 2.x code paths and drop Python 3.5 in favor of Python 3.7 (perhaps relevant for #558). I added documentation and usage examples and would be grateful for any feedback - thank you. |
Please see #324 (comment) for discussion about experimenting asyncio library in this repo. @olitheolix we need to be backwards compatible for this package. I haven't seen reasons for dropping Python 3.5 (and even strong needs for fully supporting 3.7) yet. What has been changed? |
Issues go stale after 90d of inactivity. If this issue is safe to close now please do so with Send feedback to sig-testing, kubernetes/test-infra and/or fejta. |
/remove-lifecycle stale |
Issues go stale after 90d of inactivity. If this issue is safe to close now please do so with Send feedback to sig-testing, kubernetes/test-infra and/or fejta. |
/remove-lifecycle stale |
Issues go stale after 90d of inactivity. If this issue is safe to close now please do so with Send feedback to sig-testing, kubernetes/test-infra and/or fejta. |
/remove-lifecycle stale |
Issues go stale after 90d of inactivity. If this issue is safe to close now please do so with Send feedback to sig-testing, kubernetes/test-infra and/or fejta. |
/remove-lifecycle stale |
Issues go stale after 90d of inactivity. If this issue is safe to close now please do so with Send feedback to sig-testing, kubernetes/test-infra and/or fejta. |
/remove-lifecycle stale |
Just curious but, @tomplus what was your motivation for doing this? Can't sync libraries be used drop-in inside an async application/context? |
I'm not Tom, but I used kubernetes_asyncio in the past to build a highly stateful nginx plus controller based on watches, which requires quite a bit of coordination between different parts of the system. Having a native async library makes this task a lot easier. |
Issues go stale after 90d of inactivity. If this issue is safe to close now please do so with Send feedback to sig-contributor-experience at kubernetes/community. |
/remove-lifecycle stale |
The Kubernetes project currently lacks enough contributors to adequately respond to all issues and PRs. This bot triages issues and PRs according to the following rules:
You can:
Please send feedback to sig-contributor-experience at kubernetes/community. /lifecycle stale |
/remove-lifecycle stale |
Calling blocking sync functions from a async function blocks the entire event loop which is unacceptable in most cases. @mecampbellsoup |
@roycaihw since Python 2.X and 3.5 has reached EOL (Python 3.6 reaches EOL 23 December this year) is there something still blocking this? |
Any updates on this? |
The Kubernetes project currently lacks enough contributors to adequately respond to all issues and PRs. This bot triages issues and PRs according to the following rules:
You can:
Please send feedback to sig-contributor-experience at kubernetes/community. /lifecycle stale |
/remove-lifecycle stale |
/lifecycle frozen |
So what's the state of this? Is there a goal to merge @tomplus changes or implement a new solution? |
I would also love to see this become a possibility, what needs to be done for this change? Would it be possible for anyone to do a wrap-up of what is needed for native asyncio support? |
kubernetes_asyncio works great |
The attached PR seems to have gone stale and closed. People are gonna really struggle to develop WebSocket-based K8s integrations in Python without this, obviously among other use-cases. |
Why not use the dropin replacement kebernetes-asyncio? @des1redState |
Hi guys.
Do you consider providing this client library with support for asyncio ?
Regards,
Tomasz Prus
(copy of kubernetes-client/python-base#27)
The text was updated successfully, but these errors were encountered: